我将如何使用 zip 实现对具有列表值的两个键的字典理解?

How would I achieve this dict comprehension of two keys with list values using zip?

我过去一直在尝试将我拥有的代码片段转换为代码理解,不是因为它更快或更有用,而是因为它会帮助我更多地理解 Python。

我有一个正在读取的生成器,它包含 2 个值,1 个值用于 EN,1 个值用于 AR(语言)。我想将里面的值映射到一个新字典中,它有 2 个键 ENAR,其中包含每种语言的值列表。这些语言是从名为 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')
>>>