繁体   English   中英

从词典列表中联合所有键

[英]Union of all keys from a list of dictionaries

说我有一个词典列表。 它们在每行中大多数具有相同的键,但有一些不匹配并且具有额外的键/值对。 是否有快速的方法来获取所有行中的所有键的集合?

现在我正在使用这个循环:

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()现在返回一个类似于set的对象:

>>> 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)那样做 set(a) | set(b) ,你可以做a.keys() | b.keys() a.keys() | b.keys()对我来说似乎有点a.keys() | b.keys()


1它也可以在python2.7上运行。 使用dict.viewkeys而不是dict.keys

你可以做:

from itertools import chain
return set(chain.from_iterable(dictlist))

正如@Jon Clements所指出的那样,这可以只在内存中保留所需的数据,而不是对chainunion使用*运算符。

sets就像字典,并有一个update()方法,所以这将在你的循环中工作:

keys.update(row.iterkeys())

如果你担心性能,你应该退出dict.keys()方法,因为它在内存中创建一个列表。 你可以使用set.update()而不是union,但我不知道它是否比set.union()更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM