合并两个在dict中具有相同项目的列表

时间:2015-09-21 04:57:20

标签: python

我有两个名为a_listb_list的列表:

a_list = [{'category_id': 1, 'category_name': u'AAA'}, \
    { 'category_id': 2, 'category_name': u'BBB'}]

b_list = [{'project_count': u'20', 'category_name': u'AAA'}, \
    {'project_count': u'31', 'category_name': u'BBB'}]

我想制作一个新列表c_list,它将a_listb_listcategory_name结合起来。结果列表应如下所示:

c_list = [{'category_id': 1,'project_count': u'20', 'category_name': u'AAA'},\
    {'category_id': 2,'project_count': u'31', 'category_name': u'BBB'}]

目标是能够同时访问page_max和' category_id'对于相同的' category_name'。

for entry in c_list:
    page_num =1
    category_name   =  entry['category_name']
    category_id     =  entry['category_id']
    url = 'https://www.test.com?category_id=%(category_id)s&page=%(page)s' % {'category_id': category_id, 'page': str(page_num)}
    print url

    # AAA project_count is 20 
    # BBB project_count is 31
    page_max = int(entry['project_count'])
    for i in range(page_max - 1):
        page_num += 1
        url = 'https://www.test.com?category_id=%(category_id)s&page=%(page)s' % {'category_id': category_id, 'page': str(page_num)}
        print url

如何根据键'category_name'的值合并列表中的词典?

3 个答案:

答案 0 :(得分:4)

您可以创建{category_name:dict}的中间字典,然后使用update:

temp = {a['category_name']: dict(a) for a in a_list}
for b in b_list:
    temp[b['category_name']].update(b)
c_list = list(temp.values())    # list() unnecessary in py2.X

但是,这并不能保证列表的顺序。如果订单很重要:

c_list = [temp[a['category_name']] for a in a_list]

答案 1 :(得分:0)

如果保留列表的顺序很重要,可以使用有序字典作为中间结果。

请注意,如果let date = NSDate(timeIntervalSince1970: 1442351280) a_list不完全重叠(一个包含在另一个中找不到的类别),此解决方案也有效。

b_list

答案 2 :(得分:0)

如果订单不重要,您可以使用:

首先将a_list复制到c_list

import copy
c_list=copy.deepcopy(a_list)

for i in c_list:
    for j in b_list:
        if i['category_name'] == j['category_name']:
            i['project_count'] = j['category_name']

print c_list

输出:

[{'project_count': u'AAA', 'category_id': 1, 'category_name': u'AAA'}, {'project_count': u'BBB', 'category_id': 2, 'category_name': u'BBB'}]