2016-10-14 16 views
6

の更新リスト:パイソン:私はこのようなタプルのリストを有するタプル

リスト= [(1、 'Q')、(2、 'W')、(3、 'E')、( 4、 'r')]

私はリスト内のアイテムを検索してnumを変更する更新関数update(item、num)を作成しようとしています。私は(6、W)結果は

list = [(1, 'q'), (6, 'w'), (3, 'e'), (4, 'r')] 

あろう更新を使用する場合

は、例えば、私はこのコードを試みたが、私は

if item in heap: 
     heap.remove(item) 
     Pushheap(item,num) 
    else: 
     Pushheap(item,num) 

Pushheapがでタプルをプッシュ機能でエラーが発生しましたヒープ アイデア?

+3

タプルに値を代入することはできないので、タプルを完全に置換する必要があります。 – njzk2

+7

機能の実行内容を明確にしていません。試したことだけでなく例も役立ちます –

+2

できません。タプルは不変です。ただし、タプルをリストから削除して置き換えて、これを回避することができます。しかし、私はあなたがそれらの値を変更する必要がある場合はなぜタプルを使用して尋ねることができますか? –

答えて

5

あなたは、単にあなたが必要な項目を見つけたとき、ループを抜け出し、(あなたはタプルを変更することはできません)希望の文字を持つタプルを探してリストをスキャンし、全体のタプルを置き換えることができます。例えば、

lst = [(1, 'q'), (2, 'w'), (3, 'e'), (4, 'r')] 

def update(item, num): 
    for i, t in enumerate(lst): 
     if t[1] == item: 
      lst[i] = num, item 
      break 

update('w', 6) 
print(lst) 

出力

[(1, 'q'), (6, 'w'), (3, 'e'), (4, 'r')] 

しかし、あなたは真剣に代わりにタプルのリストの辞書を使用することを検討すべきです。ディクショナリを検索する方がリストをリニアにスキャンするよりもはるかに効率的です。

+0

@ PM_2Ring 'enumerate'を使ってインデックスを取り込むことが啓発されました。 +1 – user2728397

+3

@Rakesh_K 'enumerate'は非常に便利な関数です。クリーンでコンパクトなコードになるだけでなく、インデックスの「範囲」をループしてリスト(または他の順序付けされたコレクション)にインデックスを付けるよりも高速です。ところで、ゼロ以外の数からカウントを開始したい場合は、追加の 'start' argを取ることができます。 –

3

コメントに記載されているとおり、変更しようとしているデータ項目に不変のデータ構造を使用しています。それ以上の文脈がなければ、タプルのリストではなく、辞書が必要なように見えます。また、タプル(文字)の2番目の項目をキーにしたいと思うように見えます。

これらの前提を使用して、タプルのリストを辞書に変換し、通常の辞書割り当てを使用することをお勧めします。これはまた、の注文が重要ではない場合は(OrderedDictを使用することができます)、同じ文字が2回表示されないことを前提としています(最後の数字だけがdictにあります)。

>>> lst = [(1, 'q'), (2, 'w'), (3, 'e'), (4, 'r')] 
>>> item_dict = dict(i[::-1] for i in lst) 
>>> item_dict 
{'q': 1, 'r': 4, 'e': 3, 'w': 2} 
>>> item_dict['w'] = 6 
>>> item_dict 
{'q': 1, 'r': 4, 'e': 3, 'w': 6} 
1

タプルは不変オブジェクトです。つまり、一度作成されると、内容を変更することはできません。

ただし、これを回避するには、変更するタプルを置き換えます。おそらくこのような何か:

def change_item_in_list(lst, item, num): 
    for pos, tup in enumerate(lst): 
     if tup[1] == item: 
      lst[pos] = (num, item) 
      return 

l = [(1, 'q'), (2, 'w'), (3, 'e'), (4, 'r')] 
print(l) 
change_item_in_list(l, 'w', 6) 
print(l) 

しかし@brianpckとしては、すでに代わりにタプルのリストの-dictionaryあなたはおそらく(注文)したい、としています。

関連する問題