2016-11-20 7 views
0

私は、次のような単純なデータ構造を持っている:Pythonで辞書の2つのリストを結合するには?

teams = [ { 'league_id': 1, 'name': 'Kings' }, { 'league_id': 1, 'name': 'Sharkls' }, { 'league_id': 2, 'name': 'Reign' }, { 'league_id': 2, 'name': 'Heat' } ] 
leagues = [ { 'league_id': 1, 'name': 'League 1' }, { 'league_id': 2, 'name': 'League 2' } ] 

をそして私は、次のdict理解している:

league_teams = { x['league_id']: [ t['name'] 
    for t in teams if t['league_id'] == x ['league_id'] ] 
    for x in leagues } 

得られます

{1: ['Kings', 'Sharkls'], 2: ['Reign', 'Heat']} 

itertoolsかを使用して簡単な方法ありますその命令を得るための何か?これはちょっと面倒です。

+0

を検索することが必要ですリーグで?あなたがしたくない場合: 'league_teams = {x ['name']:[t ['name'] t ['league_id'] == x ['league_id']] リーグの場合、チーム内でのtのための } '? –

+0

*これは少し面倒な感じです* ...これは、私たちが動作しないコードのトラブルシューティングとして、StackOverflowの話題にならないかもしれません。 [CodeReview](http://codereview.stackexchange.com/)に投稿することを検討してください。率直に言って、私はコードに関する問題は見ません。 – Parfait

答えて

1

itertoolsここではcollections.defaultdictをお勧めします。解の複雑さはO(n * m)ですが、defaultdictではO(n + m)になります。

あなたが好きな望むものを達成することができます:最後にmy_dictは値を保持します

from collections import defaultdict 

# create set to store `league_id` in `leagues`. Set holds unique 
# values and also searching in set is faster than in normal list 
leagues_id = set([item['league_id'] for item in leagues]) 

my_dict = defaultdict(list) 

for item in teams: 
    if item['league_id'] in leagues_id: 
     my_dict[item['league_id']].append(item['name']) 

{1: ['Kings', 'Sharkls'], 2: ['Reign', 'Heat']} 

編集:あなたはまたのためにmy_dictのエントリをしたい場合league_idチーム内には存在しないが、リーグ内に存在する場合は、明示的に次のようなエントリを作成する必要があります。

for leagues_id in leagues_ids: 
    _ = my_dict[leagues_id] # Will create empty list for such ids 
+0

良い解決方法はありませんが、記録的な空のリーグ(名前とIDを持っているがチームは存在しないリーグ)が記録されます。 OPのコードは、それらをリーグIDに関連付けられた空のリストとして記録します。 – jez

+0

あなたは私の現在のコードでそれを修正する方法を知っているだろうと思う:) –

+0

挑戦が受け入れられました - 私の答えを参照してください。 – jez

0

t['league_id'] == x['league_id']を確認する必要はありません。

あなたはして簡素化することができます:あなたは本当にそのためitertoolsたい場合

import collections 

league_teams = collections.defaultdict(list) 
for t in teams: 
    league_teams[t['league_id']].append(t['name']) 

import itertools 

league_teams = {k: [t['name'] for t in g] 
       for k, g in itertools.groupby(teams, key=lambda t: t['league_id'])} 

をしかしチームリストがソートされている場合にのみ動作します。

0

Moinuddin QuadriのO(n + m)ソリューションは、「空のリーグ」のケースを捉え、さらにモジュールをインポートする必要はありません。辞書outputは彼のleague_idsセットとして二重の義務を行い、事前に初期化だから、それはする必要はありませんcollections.defaultdict

output = { league['league_id']:[] for league in leagues } 
for team in teams: 
    if team['league_id'] in output: 
     output[team['league_id']].append(team['name']) 
print(output) 

出力は次のようになります。

{1: ['Kings', 'Sharkls'], 2: ['Reign', 'Heat']}

+0

私は "Sharkl"が小さなバイエルンのサメであると推測します。 – jez

+1

これはうまくいくが、ここでは複雑さが(m +(n * m))となる。なぜなら 'if'はチェックを行うためにリストを徹底的に反復するからである。 –

+0

' if'を避けるために 'try '...'を除いてKeyError: 'append'の周りをパスします。しかし、私はこれらのO()計算では、すべての場合において、dictキーの検索も省略していると思います。 – jez

関連する問題