python – 创建列表字典的单行程序

怎么做这个列表/字典理解

转这个[(“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),因为您只需要迭代列表一次.第一种解决方案更为可取,因为它更易于阅读,高效和可维护.

点赞