繁体   English   中英

python上的嵌套列表理解

[英]Nested list comprehension on python

我是 python 的初学者,我想使用理解来创建字典。 假设我有以下两个列表,并希望将它们转换为字典,如{'Key 1':['c','d'], 'Key 2':['a','f'], 'Key 3':['b','e']} 我只能想到下面的代码,我不知道如何使用理解来更改键和过滤器的值。 我应该如何更改我的代码?

value = ['a','b','c','d','e','f']
key = [2, 3, 1, 1, 3, 2]
{"Key 1" : [value for key,value in list(zip(key,value)) if key==1]}

这应该这样做:

value = ['a','b','c','d','e','f']
key = [2, 3, 1, 1, 3, 2]

answer = {}
for k, v in zip(key, value):
    if k in answer:
        answer[k].append(v)
    else:
        answer[k] = [v]

print(answer)
{2: ['a', 'f'], 3: ['b', 'e'], 1: ['c', 'd']}

编辑:哎呀,跳了枪。 道歉。

这是理解版本,但效率不高:

{
    k: [v for i, v in enumerate(value) if key[i] == k]
    for k in set(key)
}

编辑2:

这是一个具有更好复杂性的方法:

import pandas as pd
series = pd.Series(key)
{
    k: [value[i] for i in indices]
    for k, indices in series.groupby(series).groups.items()
}

你可以用字典理解列表理解来做到这一点:

{f"Key {k}" : [value for key,value in zip(key,value) if key == k] for k in key}

您的列表将产生以下结果:

{'Key 2': ['a', 'f'], 'Key 3': ['b', 'e'], 'Key 1': ['c', 'd']}

按照要求。

使用 dict setdefault

value = ['a', 'b', 'c', 'd', 'e', 'f']
key = [2, 3, 1, 1, 3, 2]
d = {}
{d.setdefault(f'Key {k}', []).append(v) for k, v in zip(key, value)}
print(d)

输出

{'Key 2': ['a', 'f'], 'Key 3': ['b', 'e'], 'Key 1': ['c', 'd']}

通常,它被写成一个显式循环(O(n) 解决方案):

>>> letters = 'abcdef'
>>> digits = [2, 3, 1, 1, 3, 2]
>>> from collections import defaultdict
>>> result = defaultdict(list)  # digit -> letters
>>> for digit, letter in zip(digits, letters):
...     result[digit].append(letter)
>>> result
defaultdict(<class 'list'>, {2: ['a', 'f'], 3: ['b', 'e'], 1: ['c', 'd']})

嵌套理解(O(nn) 解决方案)就像在其他答案中一样:

>>> {
...     digit: [letter for d, letter in zip(digits, letters) if digit == d]
...     for digit in set(digits)
... }
{1: ['c', 'd'], 2: ['a', 'f'], 3: ['b', 'e']}

如果您需要将其写为单个 dict itertools.groupby ,则可以使用itertools.groupby (O(n log n) 解决方案):

>>> from itertools import groupby
>>> {
...     digit: [letter for _, letter in group]
...     for digit, group in groupby(
...         sorted(zip(digits, letters), key=lambda x: x[0]), 
...         key=lambda x: x[0]
...     )
... }

暂无
暂无

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

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