0

私は 2 つのリストを持っています。1 つは少数の有名人の情報を保存するリストで、もう 1 つはこれらの俳優に関する賞の情報を保存するリストです。

解決しようとしている問題は、これら 2 つのリストを 1 つに結合して、賞の情報が本質的に賞のリストである属性になるようにすることです。はい、これは簡単に達成できます。

for actor in actor_info:
    for award in award_list:
        if actor['personid'] == award['personid']:
            if not actor.get('awards', False):
                actor.update({'awards':[]})
            actor['awards'].append(award)

しかし、上記のコードを観察するとlen(actor_info) * len(award_list)、洗練されたソリューションではない回数が繰り返されます。実行サイクルがはるかに少ない、この問題に対する他の視点はありますか。


ノート:

問題をより明確に説明するために、使用しているデータ構造を以下に説明しました。actor_info および award_info リストの各要素は、基本的に辞書です。

actor_info = []

d = {}
d['personid'] = 1210
d['firstname'] = 'Robert , Jr'
d['lastname'] = 'Downey'
d['birthplace'] = 'manhattan, NY'

d1 = {}
d1['personid'] = 2842
d1['firstname'] = 'Brad'
d1['lastname'] = 'Pitt'
d1['birthplace'] = 'Shawnee, OK'

d2 = {}
d2['personid'] = 361
d2['fname'] = 'Cate'
d2['lname'] = 'Blanchett'
d2['birthplace'] = 'Melbournce, Victoria'

d3 = {}
d3['personid'] = 261
d3['fname'] = 'Meg'
d3['lname'] = 'Ryan'
d3['birthplace'] = 'Melbournce, Victoria'

actor_info.append(d)
actor_info.append(d1)
actor_info.append(d2)
actor_info.append(d3)

賞情報:

k = {} 
k['year'] = '1992'
k['won'] = 'NO'
k['category'] = 'Best Actor'
k['name'] = 'Academy Award'
k['movie'] = 'Chaplin'
k['personid'] = 1210

k1 = {}
k1['year'] = '2008'
k1['won'] = 'NO'
k1['category'] = 'Best Actor'
k1['name'] = 'Academy Award'
k1['movie'] = 'Tropic thunder'
k1['personid'] = 1210

k2 = {}
k2['year'] = '2008'
k2['won'] = 'NO'
k2['category'] = 'Best Actor'
k2['name'] = 'Academy Award'
k2['movie'] = 'The Curious Case of Benjamin Button'
k2['personid'] = 2842

k3 = {}
k3['year'] = '1989'
k3['won'] = 'yes'
k3['category'] = 'Best supporting Actress'
k3['name'] = 'Academy award'
k2['movie'] = 'Aviator'
k3['personid'] = 361

award_list = []
award_list.append(k)
award_list.append(k1)
award_list.append(k2)
award_list.append(k3)
4

2 に答える 2

0

まず、actor_info を次のように保存する方法を再構築します。

actor_info['personid'] = {'fname':'Cate',...,"awards":list()}

現在のコードでは、これは次のコードで実現できます。

actor_info = {}
for actor in [d,d1,d2,d3]:
    actor_info[actor['personid']] = dict([(k,v) for (k,v) in actor.items() if k != 'personid'])
    actor_info[actor['personid']]['awards'] = list()

次に、各俳優に賞を授与します

for award in award_list:
    if actor_info.has_key(award['personid']): #if an actor exists with the same personID
        actor_info[award['personid']]['awards'].append(award) #append the award to their award list

これは約 O(N) 時間で実行されます。

于 2013-05-13T00:23:46.750 に答える