2017-09-06 5 views
2

私は従業員のロータと従業員の詳細のリストを持っています。ロータに姓を追加するにはどうすればいいですか?他のリストのリストにある詳細を使ってリストを更新する方法

実際のロータには、同じ人物が多数繰り返された数百のエントリがあります(ただし、すべての従業員は異なる名前)。詳細リストには約100のエントリがあり、従業員は1人または2人いないことがあります。

以下のコードは動作しますが、すべてのロータのエントリについてすべての詳細をループします。より効率的な方法(Python 2.7を使用して)がありますか? '?'名前が見つからない場合は? (!私は考えることができ申し訳ありませんが、これは混乱している場合は、その最も単純な例)

rota = [['Paul'], ['Paul'], ['Steve'], ['Steve'], ['Steve'], ['Simon'], ['Bob'], ['Steve']] 
details = [['Paul', 'Smith'], ['Simon', 'Says'], ['Steve', 'Brown']] 

for eachName in rota: 
    for eachEmployee in details: 
     if eachName[0] == eachEmployee[0]: 
      eachName.append(eachEmployee[1]) 

print rota 

答えて

2

あなたは、単に辞書にdetailsを変換する必要があります。

rota = [['Paul'], ['Paul'], ['Steve'], ['Steve'], ['Steve'], ['Simon'], ['Bob'], ['Steve']] 
details = dict([['Paul', 'Smith'], ['Simon', 'Says'], ['Steve', 'Brown']]) 

for eachName in rota: 
    surname = details.get(eachName[0]) 
    if surname: 
     eachName.append(surname) 

print(rota) 

注一つだけがあることforループが残っており、処理がはるかに高速になるはずです。あなたのdictで

値は、複数の属性を持つタプルをすることができます:あなたが効率的に警告して、リストや辞書内包表記でこれを行うことができます

>>> details = dict([['Paul', ('Smith', 32)], ['Simon', ('Says', 20)], ['Steve', ('Brown', 52)]]) 
>>> details 
{'Steve': ('Brown', 52), 'Paul': ('Smith', 32), 'Simon': ('Says', 20)} 
+0

ブリリアント!残念ながら、従業員ごとに2つ以上の詳細があるので、私の例を過度に簡略化しましたが、必要な2つの詳細だけでリストを複製するのは簡単でなければなりません。ありがとうございました。 – Phil

0

- すべてのキーが両方のリストでなければなりません。 "Bob"のキーの不一致が元のコードからコメントアウトされていることに注意してください。

>>> rota = [['Paul'], ['Paul'], ['Steve'], ['Steve'], ['Steve'], ['Simon']] #, ['Bob']] 
>>> details = [['Paul', 'Smith'], ['Simon', 'Says'], ['Steve', 'Brown']] 
>>> d = {n[0]: n[1] for n in details} 
>>> [list([n[0],d[n[0]]]) for n in rota] 
[['Paul', 'Smith'], ['Paul', 'Smith'], ['Steve', 'Brown'], ['Steve', 'Brown'], ['Steve', 'Brown'], ['Simon', 'Says']] 
>>> 
+0

コードを試しましたか? –

+0

Yikes!キーエラーがある場合、これは機能しません。フィードバックをお寄せいただきありがとうございます。 –

関連する問題