【发布时间】:2017-08-21 03:26:23
【问题描述】:
假设我有两个字典列表:
a=[{'name':'A','color':'1'},
{'name':'B','color':'2'}]
b=[{'name':'A','color':'3'},
{'name':'c','color':'1'}]
我需要这样的东西:
for i in a:
if i['name'] is not existent in b['name']:
do this.
else:
if i['color'] is < than the corresponding item in b list:
do that.
我不知道如何从导致迭代继续“else:”的第二个列表中获取元素。
我需要说第一个列表较小(几百个项目),但第二个列表有几千个字典,每个大约有一百个项目-效率非常重要。
我确实考虑过为两个列表中的 key['name'] 制作一个所有值的列表并进行比较,但这意味着第一次迭代以制作这些列表,然后重复列表以执行此操作或去做。 提前致谢!
【问题讨论】:
-
如果
b中的名称是唯一的。我建议你更改b的构造。 b={'A':{'color':'3'},'c':{'color':'1'}}。然后可以使用 b[i['name']] 来获取 {'color':'1'} 等属性。所以 b[i['name']]['color'] 是颜色的数量。使用这种结构会更有效。如果你同意,我可以给你更多的例子作为答案。 -
@Zealseeker b 中的每个元素都是一个具有约 100 个键的唯一字典,每个键都有一个值/键,其中一个键是“名称”。你说要从字典列表转换为嵌套字典。我需要考虑清楚。
-
不要为两个列表创建一个值列表,而是只为列表 B 执行此操作。然后将 if 条件更改为
if i['name'] is not existent in names_in_b:您需要检查此方法的性能增益,但是有了这个,你只需要对 B 进行一次迭代,然后对 A 进行迭代。 -
您可以按名称保留仅存在于
a和b上的值,拆分为 2 个新数组。此数组之一将仅包含唯一的名称。排序另一个并zip他们。 -
@Mike 如果名称可以是每个项目的唯一索引,最好创建一个嵌套字典,因为这样可以快速搜索。此外,您还可以轻松创建仅保留项目索引的字典。例如:
{'A': 0, 'c': 1}这样会更快。
标签: python list dictionary