创建有两对密钥的字典/列表:值/项具有迭代形式

问题描述 投票:0回答:2

我希望得到一本字典和列表像

{f1(0):g1(0), f2(0):g2(0),f1(1):g1(1), f2(1):g2(1)}
[f1(0),f2(0),f1(1),f2(1)]

其中f1(x), f2(x)g1(x), g2(x)一些定义的函数。

有两个发电集团f1(x):g1(x),f2(x):g2(x)for i in range(2)

我们可以通过下面的代码定义这本字典

new_dict = {f1(x):g1(x) for x in range(2)}
new_dict.update({f2(x):g2(x) for x in range(2)})

但是列表中有订单,看来我不得不通过创建for循环这样的列表。

new_list= list()
for i in range(2)
    new_list.append(f1(i))
    new_list.append(f2(i))

我不知道是否有类似以下一些优雅的方式:

{f1(x):g1(x), f2(x):g2(x) for x in range(2)}
[f1(x) , f2(x)  for x in range(2)]
python-3.x data-structures
2个回答
1
投票

使用的功能列表中的理解。

{f(x): g(x) for x in range(2) for f, g in [(f1, g1), (f2, g2)]}

名单中还可能可能是一个字典,这取决于你有多在乎排序(例如,如果一个密钥可能会被覆盖),但是需要注意的是Python的3.7类型的字典,现在规定要记住的插入顺序(和OrderedDict总是有)

new_dict = {f(x): g(x) for x in range(2) for f, g in {f1:g1, f2:g2}.items()}

您可以将键转换到一个列表像

new_list = [*new_dict]

这将具有相同的插入顺序,但字典不能包含重复键,所以单从它也不会有的制造。这可能是也可能不是你想要的。

如果你想保留副本,做对的列表,然后再使用它来使字典和列表。

pairs = [(f(x), g(x)) for x in range(2) for f, g in [(f1, g1), (f2, g2)]]
new_dict = dict(pairs)
new_list = [f for f, _ in pairs]

如果你还在使用旧版本的Python,请注意,您也可以从像这样对作出OrderedDict

from collections import OrderedDict

new_dict = OrderedDict((f(x), g(x)) for x in range(2) for f, g in [(f1, g1), (f2, g2)])

0
投票

我不知道是否有类似以下一些优雅的方式:

{f1(x):g1(x), f2(x):g2(x) for x in range(2)}
[f1(x) , f2(x)  for x in range(2)]

可以具有变化数量的输出通过使用链中的每个回路。

from itertools import chain

[*chain.from_iterable([f1(x), f2(x)] for x in range(2))]
dict(*chain.from_iterable([(f1(x), g1(x)), (f2(x), g2(x))] for x in range(2)))

你也可以做链接自己,但它需要更多的循环。

[f for fs in ((f1(x), f2(x)) for x in range(2)) for f in fs]
© www.soinside.com 2019 - 2024. All rights reserved.