列表理解 - 尝试从键值对数组的数组创建字典
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')的值。您提供的代码有效,但它不处理 int
和 str
之间的类型。您需要做的就是将 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"(使用 sorted
、itertools.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]
)
}
理解的可读性和效率较低
尝试使用列表推导创建字典时(不覆盖生成的列表键)
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')的值。您提供的代码有效,但它不处理 int
和 str
之间的类型。您需要做的就是将 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"(使用 sorted
、itertools.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]
)
}
理解的可读性和效率较低