列表理解 - 尝试从键值对数组的数组创建字典

List comprehension - attempting to create dictionary from array of key-value pair arrays

尝试使用列表推导创建字典时(不覆盖生成的列表键)

x = {}
entries = [[1,'1a'], [2,'2a'], [3,'3a'], ['1', '1b'], ['2', '2b'], ['3', '3b']]
discardable = [x.setdefault(entry[0], []).append(entry[1]) for entry in entries]

Error: name 'x' is not defined

我期望 x 被填充为:

{1: ['1a', '1b'], 2: ['2a', '2b'], 3: ['3a', '3b']}

如何解释这个/使这个工作? 还有其他方法可以实现吗?

你可以试试:

from collections import defaultdict
entries = [['1','1a'], [2,'2a'], [3,'3a'], ['1', '1b'], ['2', '2b'], ['3', '3b']]
x = defaultdict(list)
[x[a].append(b) for a,b in entries]
x = dict(x)

输出

{'1': ['1a', '1b'], 2: ['2a'], 3: ['3a'], '2': ['2b'], '3': ['3b']}

有些键是str,有些是int,所以这会产生

{'1': ['1a', '1b'], 2: ['2a'], 3: ['3a'], '2': ['2b'], '3': ['3b']}

您需要将 entry[0] 转换为 int

x = {}
entries = [[1,'1a'], [2,'2a'], [3,'3a'], ['1', '1b'], ['2', '2b'], ['3', '3b']]
[x.setdefault(int(entry[0]), []).append(entry[1]) for entry in entries]

print(x) 会给出

{1: ['1a', '1b'], 2: ['2a', '2b'], 3: ['3a', '3b']}

你想要的是合并(1, '1'), (2, '2'), (3, '3')的值。您提供的代码有效,但它不处理 intstr 之间的类型。您需要做的就是将 str 转换为 int,以便合并该值。

试试这个:

x = {}
entries = [[1,'1a'], [2,'2a'], [3,'3a'], ['1', '1b'], ['2', '2b'], ['3', '3b']]
discardable = [x.setdefault(int(entry[0]), []).append(entry[1]) for entry in entries]

您可以使用 dict comprehension。它们的工作方式很像列表理解

entries = [[1,'1a'], [2,'2a'], [3,'3a'], ['1', '1b'], ['2', '2b'], ['3', '3b']]

# Build a dictionary from the values in entries
discardable = {key:val for key, val in entries}

print (discardable)
# Result: {1: '1a', 2: '2a', 3: '3a', '1': '1b', '2': '2b', '3': '3b'}

How to explain this / make this work?

理解为每个输入创建一个输出,它们不用于变异

Is there any other way to achieve this?

使用正常的程序循环。或者使用 multidict 但标准库没有提供。

您可以执行函数转换,直到获得正确的 "shape"(使用 sorteditertools.groupby 和更多映射),但我认为这不值得, 沼泽标准 for 循环会更具可读性:

for k, v in entries:
    x.setdefault(int(x), []).append(v)

对比:

x = {
    x: list(v[1] for v in vs)
    for x, vs in itertools.groupby(
        sorted((int(k), v) for k, v in entries),
        lambda it: it[0]
    )
}

理解的可读性和效率较低