我将如何使用 zip 实现对具有列表值的两个键的字典理解?
How would I achieve this dict comprehension of two keys with list values using zip?
我过去一直在尝试将我拥有的代码片段转换为代码理解,不是因为它更快或更有用,而是因为它会帮助我更多地理解 Python。
我有一个正在读取的生成器,它包含 2 个值,1 个值用于 EN
,1 个值用于 AR
(语言)。我想将里面的值映射到一个新字典中,它有 2 个键 EN
和 AR
,其中包含每种语言的值列表。这些语言是从名为 SupportedLanguages
的配置文件中指定的:SupportedLanguages = ["en", "ar"]
.
我知道在 Javascript 中可以使用 map 和 reduce 函数完成类似的事情,但我不确定在 Python 中如何做试过似乎在做我想做的事。
这是我当前的代码片段:
reader = ([i, str(i)] for i in range(10))
rows = [row for row in reader]
SupportedLanguages = ["en", "ar"]
dict_ = {
"en": []
"ar": []
}
for row in rows:
for i, _ in enumerate(row):
dict_[SupportedLanguages[i]].append(row[i])
reader
是一个虚拟生成器,用于复制我的 csv reader 的行为(因为我有 n
行,其中 n
取决于我使用的语言数量有)。
我想出的工作解决方案是这样理解的:
{SupportedLanguages[i]: [row[i] for row in rows] for i in range(len(row))}
但是,这是在 rows
上循环两次,我不想要这种行为,我只需要一个循环,因为生成器也只会循环一次 (csv.reader
) .我知道我可以在循环之前将所有值存储到一个列表中,但是这又会创建 n
循环,我只想要 1.
编辑:
正如我上面提到的,它正在创建 2 个循环,但我应该说的是 n
个循环,就像每种语言 1 个循环一样。
我想我明白你想要达到的目标。假设您有一个如下所示的 reader
:
reader = ([en_value, ar_value] for en_value, ar_value in enumerate("abcdefg"))
for pair in reader: # Don't actually do this part - print just for demonstration
print(pair)
输出:
[0, 'a']
[1, 'b']
[2, 'c']
[3, 'd']
[4, 'e']
[5, 'f']
[6, 'g']
>>>
然后你可以通过以下方式构造你的dict_
:
supported_languages = ["en", "ar"]
dict_ = dict(zip(supported_languages, zip(*reader)))
print(dict_)
输出:
{'en': (0, 1, 2, 3, 4, 5, 6), 'ar': ('a', 'b', 'c', 'd', 'e', 'f', 'g')}
>>>
根据观察...:[=18=]
a, b = zip(*reader)
print(a)
print(b)
...产量:
(0, 1, 2, 3, 4, 5, 6)
('a', 'b', 'c', 'd', 'e', 'f', 'g')
>>>
我过去一直在尝试将我拥有的代码片段转换为代码理解,不是因为它更快或更有用,而是因为它会帮助我更多地理解 Python。
我有一个正在读取的生成器,它包含 2 个值,1 个值用于 EN
,1 个值用于 AR
(语言)。我想将里面的值映射到一个新字典中,它有 2 个键 EN
和 AR
,其中包含每种语言的值列表。这些语言是从名为 SupportedLanguages
的配置文件中指定的:SupportedLanguages = ["en", "ar"]
.
我知道在 Javascript 中可以使用 map 和 reduce 函数完成类似的事情,但我不确定在 Python 中如何做试过似乎在做我想做的事。
这是我当前的代码片段:
reader = ([i, str(i)] for i in range(10))
rows = [row for row in reader]
SupportedLanguages = ["en", "ar"]
dict_ = {
"en": []
"ar": []
}
for row in rows:
for i, _ in enumerate(row):
dict_[SupportedLanguages[i]].append(row[i])
reader
是一个虚拟生成器,用于复制我的 csv reader 的行为(因为我有 n
行,其中 n
取决于我使用的语言数量有)。
我想出的工作解决方案是这样理解的:
{SupportedLanguages[i]: [row[i] for row in rows] for i in range(len(row))}
但是,这是在 rows
上循环两次,我不想要这种行为,我只需要一个循环,因为生成器也只会循环一次 (csv.reader
) .我知道我可以在循环之前将所有值存储到一个列表中,但是这又会创建 n
循环,我只想要 1.
编辑:
正如我上面提到的,它正在创建 2 个循环,但我应该说的是 n
个循环,就像每种语言 1 个循环一样。
我想我明白你想要达到的目标。假设您有一个如下所示的 reader
:
reader = ([en_value, ar_value] for en_value, ar_value in enumerate("abcdefg"))
for pair in reader: # Don't actually do this part - print just for demonstration
print(pair)
输出:
[0, 'a']
[1, 'b']
[2, 'c']
[3, 'd']
[4, 'e']
[5, 'f']
[6, 'g']
>>>
然后你可以通过以下方式构造你的dict_
:
supported_languages = ["en", "ar"]
dict_ = dict(zip(supported_languages, zip(*reader)))
print(dict_)
输出:
{'en': (0, 1, 2, 3, 4, 5, 6), 'ar': ('a', 'b', 'c', 'd', 'e', 'f', 'g')}
>>>
根据观察...:[=18=]
a, b = zip(*reader)
print(a)
print(b)
...产量:
(0, 1, 2, 3, 4, 5, 6)
('a', 'b', 'c', 'd', 'e', 'f', 'g')
>>>