2016-08-22 6 views
3

私はリストのリストを作成するアプリケーションを持っています。リストの2番目の要素は、ルックアップリストを使用して割り当てる必要があります。ルックアップリストもリストのリストで構成されています。ルックアップテーブルとしてリストのリストを使用し、新しいリストのリストの値を更新する

"all"メソッドを使用してリストの値と一致させました。リスト値がルックアップリストに存在する場合は、新しいリスト内の2番目の位置要素を更新する必要があります。しかし、そうではありません。 ==比較は、両方のリストにすべて存在していても、すべての要素に対してFalseの一致を生成します。

インデックス検索コマンドのさまざまな組み合わせも試しましたが、各リストの値をアンパックすることはできません。

私のコードは以下の通りです。目標は、newDataの "xxx"値をlookupListの数値で置き換えることです。

lookupList= [['Garry','34'],['Simon', '24'] ,['Louise','13'] ] 

newData = [['Louise','xxx'],['Garry', 'xxx'] ,['Simon','xxx'] ] 

#Matching values 
for i in newData: 
    if (all(i[0] == elem[0] for elem in lookupList)): 
     i[1] = elem[1] 
+1

代わりに辞書を使うのはなぜですか? –

+0

@MartijnPieters私はこれを検討していましたが、私のアプリケーションがリストのリストを作成しているのを見て、これが最善の選択肢かもしれないと思っていました。また、生成される文字列は非常に冗長である可能性があり、どのようにこれが辞書に影響するかわかりません。私は各リストで数百のリストを扱っています。辞書はこれを処理する最も効果的な方法ですか? – alkey

+1

絶対に、間違いなく。新しい文字列オブジェクトはありません。リストから作成する辞書は、同じ文字列オブジェクトを参照します。 –

答えて

4

elemはジェネレータ式の外部ローカル変数ではないので、あなたは、all()であなたがやりたいことはできません。代わりに、リストを使用しての

lookupListを保存するために辞書を使用します。

lookupDict = dict(lookupList) 

との一致を検索するには、単純な一定時間(速い)の検索です:

for entry in newData: 
    if entry[0] in lookupDict: 
     entry[1] = lookupDict[entry[0]] 
0

あなたは代わりに次のように辞書を使用する必要があります。

lookupList = newData = {} 

old_lookupList = [['Garry','34'],['Simon', '24'] ,['Louise','13'] ] 
old_newData = [['Louise','xxx'],['Garry', 'xxx'] ,['Simon','xxx'] ] 

#convert into dictionary 
for e in old_newData: newData[e[0]] = e[1] 
for e in old_lookupList: lookupList[e[0]] = e[1] 

#Matching values 
for key in lookupList: 
    if key in newData.keys(): 
     newData[key]=lookupList[key] 

#convert into list 
output_list = [] 

for x in newData: 
    output_list.append([x, newData[x]]) 
関連する問題