如何将这些代码写成一行?如何用Python编写得更好?

时间:2019-07-15 02:28:33

标签: python python-3.x

我使用了一个嵌套的for循环来创建一个包含元素列表的字典。但是,这对于Python来说很笨拙。如何用Python编写更多内容?有没有一种优雅的方法可以将其写成一行?

d1 = {}
for ds in datasets:
    d1[ds] = {}
    for mutType in mutTypes:
        d1[ds][mutType] = []

2 个答案:

答案 0 :(得分:1)

您可以将其组合为两个嵌套的字典理解。我不确定将其称为更具循环性的Pythonic,但我不会与喜欢它的人争论:

datasets = ['a', 'b', 'c']
mutTypes = ['x', 'y', 'z']

d1 = {k:{mutType: [] for mutType in mutTypes} for k in datasets}

结果

{'a': {'x': [], 'y': [], 'z': []},
 'b': {'x': [], 'y': [], 'z': []},
 'c': {'x': [], 'y': [], 'z': []}}

答案 1 :(得分:1)

通常不需要在Python中预先声明数据结构。我要做的是使用defaultdict作为容器,并直接使用它。

from collections import defaultdict

d1 = defaultdict(lambda: defaultdict(list))

# Use d1 directly
d1[ds_1][mutType_1].append(123)
d1[ds_2][mutType_2].append(234)

# If you wish to strip out the nested defaultdict after, you can do something like this:
d2 = {key:dict(value) for key, value in d1.items()}

一如既往,这取决于您要执行的操作。这样使用d1意味着当您使用不在KeyError和/或datasets中的键时,它不会引发mutTypes