Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将dict列表作为另一个列表的元素追加(Python)_Python_List - Fatal编程技术网

将dict列表作为另一个列表的元素追加(Python)

将dict列表作为另一个列表的元素追加(Python),python,list,Python,List,我有两个列表,在其中一个列表中我存储了少数名人的信息,另一个列表中我存储了与这些演员有关的奖项信息 我试图解决的问题是将这两个列表合并为一个,其中奖励信息成为一个属性,本质上是一个奖励列表。是的,这很容易实现 for actor in actor_info: for award in award_list: if actor['personid'] == award['personid']: if not actor.get('awards', F

我有两个列表,在其中一个列表中我存储了少数名人的信息,另一个列表中我存储了与这些演员有关的奖项信息

我试图解决的问题是将这两个列表合并为一个,其中奖励信息成为一个属性,本质上是一个奖励列表。是的,这很容易实现

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(演员信息)*len(奖励列表)
次,这不是一个优雅的解决方案。对于这个问题,还有其他的观点吗?执行周期要少得多


注意:

为了更清楚地解释这个问题,我在下面描述了我使用的数据结构。演员信息和奖项信息列表中的每个元素本质上都是一个字典

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)

首先,您应该从字典切换到集合.namedtuple,它允许您以普通属性的形式访问数据

无论如何,您可以通过事先制作查找表来避免二次迭代

idToActor = {a['personid']:a for a in actor_info}

for award in award_list:
    actor = idToActor[award['personid']]
    actor.setdefault('awards',[]).append(award)

首先,我要将存储演员信息的方式重组为:

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()
现在给每位演员颁奖


这将在大约0(N)个时间内运行。

感谢您对collections的建议。namedtuple将立即实施。
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