怎么做这个列表/字典理解
转这个[(“a”,1),(“b”,2),(“a”,3)]
进入这个
{
"a": [1, 3],
"b": [2]
}
我知道如何在for循环中执行它,我可以只使用一行来完成工作吗?
最佳答案 一个简单的方法是使用一个简单的
collections.defaultdict()
列表:
from collections import defaultdict
lst = [("a", 1), ("b", 2), ("a", 3)]
items = defaultdict(list)
for k, v in lst:
items[k].append(v)
print(items)
这创造了:
defaultdict(<class 'list'>, {'a': [1, 3], 'b': [2]})
注意:如果您希望最终结果是普通字典,则可以包装dict().
如果你真的想要一个衬垫,你可以在dict理解中使用itertools.groupby()
:
>>> from itertools import groupby
>>> from operator import itemgetter
>>> lst = [("a", 1), ("b", 2), ("a", 3)]
>>> {k: list(map(itemgetter(1), g)) for k, g in groupby(sorted(lst, key=itemgetter(0)), key=itemgetter(0))}
{'a': [1, 3], 'b': [2]}
其中也可以更清晰地写成:
{k: [x[1] for x in g] for k, g in groupby(sorted(lst, key=itemgetter(0)), key=itemgetter(0))}
由于排序,上述解决方案具有O(NlogN)复杂性,如果要将类似项目组合在一起,则需要这样做.这比第一个defaultdict解决方案效率低,它是O(N),因为您只需要迭代列表一次.第一种解决方案更为可取,因为它更易于阅读,高效和可维护.