相互比较和完成列表

时间:2016-12-17 02:43:19

标签: python python-2.7 list dictionary

我这里有一个非常棘手的任务。我想比较列表列表中的x个列表,列表中包含词典。所以我想根据词典中的“名称”键比较这些列表中的词典如果它匹配则应该通过,否则它应该将整个字典复制到没有它的列表,并将'balance'键值编辑为'0'。

例如,我们假设我们有这样的列表列表:

list_of_lists=[[{'name': u'Profit','balance': 10},{'name': u'Income','balance': 30},{'name': u'NotIncome','balance': 15}],[{'name': u'Profit','balance': 20},{'name': u'Income','balance': 10}]]

所以结果应该是:

list_of_lists=[[{'name': u'Profit','balance': 10},{'name': u'Income','balance': 30},{'name': u'NotIncome','balance': 15}],[{'name': u'Profit','balance': 20},{'name': u'Income','balance': 10},{'name': u'NotIncome','balance': 0}]]

这是我的代码但我无法使用2个或更多列表(我不知道列表中的列表数量(可能是2,3或4等):

for line in lines:
   for d1, d2 in zip(line[0], line[1]):
           for key, value in d1.items():
               if value != d2[key]:
                   print key, value, d2[key]

1 个答案:

答案 0 :(得分:0)

您可以先创建一个包含所有名称的set,然后逐个迭代子列表添加缺少的词组:

import pprint

l = [
        [
            {'name': u'Profit','balance': 10},
            {'name': u'Income','balance': 30},
            {'name': u'NotIncome','balance': 15}
        ],
        [
            {'name': u'Profit','balance': 20},
            {'name': u'Income','balance': 10}
        ],
        []
    ]

all_names = {d['name'] for x in l for d in x}
for sub_list in l:
    for name in (all_names - {d['name'] for d in sub_list}):
        sub_list.append({'name': name, 'balance': 0})

pprint.pprint(l)

输出:

[[{'balance': 10, 'name': u'Profit'},
  {'balance': 30, 'name': u'Income'},
  {'balance': 15, 'name': u'NotIncome'}],
 [{'balance': 20, 'name': u'Profit'},
  {'balance': 10, 'name': u'Income'},
  {'balance': 0, 'name': u'NotIncome'}],
 [{'balance': 0, 'name': u'Profit'},
  {'balance': 0, 'name': u'Income'},
  {'balance': 0, 'name': u'NotIncome'}]]

那就是说你应该考虑将子列表转换为其中键是名称和值是余额的dicts,以便于处理。