假设我有一个字典列表。它们在每一行中大多具有相同的键,但有一些不匹配并且具有额外的键/值对。有没有一种快速的方法来获取所有行中的所有键?
现在我正在使用这个循环:
def get_all_keys(dictlist):
keys = set()
for row in dictlist:
keys = keys.union(row.keys())
在具有数十万行的列表上执行此操作似乎非常低效,但我不确定如何做得更好
谢谢!
假设我有一个字典列表。它们在每一行中大多具有相同的键,但有一些不匹配并且具有额外的键/值对。有没有一种快速的方法来获取所有行中的所有键?
现在我正在使用这个循环:
def get_all_keys(dictlist):
keys = set()
for row in dictlist:
keys = keys.union(row.keys())
在具有数十万行的列表上执行此操作似乎非常低效,但我不确定如何做得更好
谢谢!
你可以试试:
def all_keys(dictlist):
return set().union(*dictlist)
避免导入,并将充分利用set
. 也适用于任何可迭代的东西。
在 python3.x 1上运行的一个有趣的依赖于现在返回一个类似集合的对象reduce
的事实:dict.keys()
>>> from functools import reduce
>>> dicts = [{1:2},{3:4},{5:6}]
>>> reduce(lambda x,y:x | y.keys(),dicts,{})
{1, 3, 5}
物有所值,
>>> reduce(lambda x,y:x | y.keys(),dicts,set())
{1, 3, 5}
也可以,或者,如果您想避免使用lambda
(和初始化程序),您甚至可以这样做:
>>> reduce(operator.or_, (d.keys() for d in dicts))
井井有条。
当你只有两个元素时,这真的最闪耀。set(a) | set(b)
然后,您可以做a.keys() | b.keys()
一些对我来说似乎更好的事情,而不是做类似的事情。
1它也可以在 python2.7 上工作。使用dict.viewkeys
代替dict.keys
你可以做:
from itertools import chain
return set(chain.from_iterable(dictlist))
*
正如@Jon Clements 所指出的,与将运算符用于chain
or相比,这只能将所需的数据保留在内存中union
。
sets
就像字典,并且有一个update()
方法,所以这将在你的循环中工作:
keys.update(row.iterkeys())
如果您担心性能,您应该退出该dict.keys()
方法,因为它会在内存中创建一个列表。而且可以用set.update()
union代替union,但不知道是不是比set.union()
.