2017-05-15 9 views
0

このコードでは、(i)番目と(i + 1)番目の項目の識別子が同じかどうかを比較するために、改行をパイプ文字に置き換える必要があります。私はリストの代わりにタプルにそれを唱えるところ、私は従うことができませんでしたPythonの特定のリスト項目から改行文字を削除する方法

TypeError: 'tuple' object does not support item assignment

string="" 
for i in range(0,len(arrangedList)-1): 
    if arrangedList[i][0]==arrangedList[i+1][0]: 
     string = arrangedList[i][1][1] 
     if "\n" in string: 
      string.replace("\n","|") 
     arrangedList[i][1][1]=string 

しかし、それはエラーを返します。

次のようにファイルの形式は次のとおりです。

[0, ('Filename', './root/lib/\n')] 
[0, ('Description', 'Socket\n')] 
[0, ('ListenStream', 'someSocket\n')] 
[0, ('SocketMode', 'someNumber\n')] 
[0, ('Service', 'someService\n')] 
[1, ('Filename', './root/lib/\n')] 
[1, ('Description', 'Socket\n')] 
[1, ('ListenStream', 'someSocket\n')] 

希望の形式は次のようになります。

[0, ('Filename', './root/lib/|')] 
[0, ('Description', 'Socket|')] 
[0, ('ListenStream', 'someSocket|')] 
[0, ('SocketMode', 'someNumber|')] 
[0, ('Service', 'someService\n|'] 
[1, ('Filename', './root/lib/|')] 
[1, ('Description', 'Socket|')] 
[1, ('ListenStream', 'someSocket|')] 

代わりに、いくつかの改行文字があります「|」今すぐキャラクター。

P.S.ポストフォーマット後、マークダウンテーブルで使用されます。

+1

'arrangedList'のコンテンツを印刷できますか?あなたのコードからは、リストのリストのように見えます。各リストは2つの要素を持ち、2つ目の要素はタプル(2つの要素)です。そうであれば、要素をタプル( '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ')おそらくタプルの代わりにリストが必要です。 – BangTheBank

答えて

2

つまり、tupleは変更できません。つまり、別の値を使用する場合は、値を変更できません。新しい値を作成する必要があります。

arrangedList[i][1][1]=stringに問題があります。

簡単な修正:arrangedList[i][1]=(arrangedList[i][1][0], string)

(それはlistだから、あなたがtuplearrangedList[i][1]に割り当てることができません)

+0

ある時点で、あらかじめ定義されたリストがタプルに変更されました。 – Elesmoth

1

それは正しくタプルを述べたように、不変オブジェクトです。したがって、入力データがタプル形式の場合は、たとえばリストに変換してからデータを変更する必要があります。これを試してみてください:

arrangedList = [[0, ('Filename', './root/lib/\n')], 
       [0, ('Description', 'Socket\n')], 
       [0, ('ListenStream', 'someSocket\n')], 
       [0, ('SocketMode', 'someNumber\n')], 
       [0, ('Service', 'someService\n')], 
       [1, ('Filename', './root/lib/\n')], 
       [1, ('Description', 'Socket\n')], 
       [1, ('ListenStream', 'someSocket\n')]] 

# Convert the tuples to lists 
for item in arrangedList: 
    item[1] = list(item[1]) 

string="" 
for i in range(0,len(arrangedList)-1): 
    if arrangedList[i][0]==arrangedList[i+1][0]: 
     # string = arrangedList[i][1][1] 
     print('STRING: ', string) 
     string = arrangedList[i][1][1] 
     if "\n" in string: 
      string = string.replace("\n","|") 
     arrangedList[i][1][1]=string 

print(arrangedList) 

またreplace方法が変更と元の文字列のコピーを返すことに、注意してください。元の文字列は変更されません。

もう1つ - 出力はFilename', './root/lib/|のようになりますが、このようにはなりません'Filename', './root/lib/'|。パイプ記号は文字列の内側になければなりません。

+0

'if" \ n "in string:'がなくなるはずです。 'string'は' '' 'に初期化する必要はありません。 'string'は悪い名前です。データ構造全体が最初から変更されるべきであり、コードのこの部分では特別なものではない。 – hop

+0

@hop、私はあなたに同意します。私は別の名前をつけるだろう。私の答えは彼の問題を解決することですが、変数の名前を変更することはありません。 – Nurjan

関連する問題