【问题标题】:How to convert this for loop into a dict comprehension?如何将此for循环转换为dict理解?
【发布时间】:2019-03-21 08:29:51
【问题描述】:

我可以做到这一点

mydict = {}
for a in range(0,6):
    mydict[a] = []

print (mydict)

#{0: [], 1: [], 2: [], 3: [], 4: [], 5: []}

问题是如何通过 dict 理解来实现这一点?

编辑:

d = {level: [] for level in range(1, level + 1)}

for each_level in d:
    d[each_level] = [ExampleClass(1, 1)
                         for _ in range(5)]

很抱歉没有把我从一开始就有的东西拿出来,我认为这不会有多大帮助。

这就是我所拥有的,它做了我想要的,但我想知道是否有一种方法可以将所有这些缩短到一行左右。

最后,我想要这样的东西:

d = {level: [] for level in range(1, level + 1), [ExampleClass(1, 1) for _ in range(5)]

【问题讨论】:

  • 向您解释反对意见:问题很明确,但您可以自己尝试一些 dict 理解并解释问题出在哪里。
  • 很抱歉。我已经编辑了 OP

标签: python python-3.x python-2.7 dictionary dictionary-comprehension


【解决方案1】:

像这样:

d = {a:[] for a in range(6)}

不要将名称 dict 用于您自己的变量,您将隐藏内置名称 dict
另请注意,如果您不向range 提供start 参数,则默认为0

您可能还想查看collections 模块中的defaultdict,而不是自己用空列表初始化dict。演示:

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d[0]
[]
>>> d[1]
[]

列表仅在您第一次访问密钥时被实例化。

>>> d
defaultdict(<class 'list'>, {0: [], 1: []})

编辑:~跟进~

我没有你的示例类,但你应该能够从这个演示中学习必要的 synatx。 slice 将代替您的ExampleClass

>>> ExampleClass = slice
>>> d = {a:[ExampleClass(1, 1) for _ in range(5)] for a in range(6)}
>>> d
{0: [slice(1, 1, None), slice(1, 1, None), slice(1, 1, None), slice(1, 1, None), slice(1, 1, None)], 1: [slice(1, 1, None), slice(1, 1, None), slice(1, 1, None), slice(1, 1, None), slice(1, 1, None)], 2: [slice(1, 1, None), slice(1, 1, None), slice(1, 1, None), slice(1, 1, None), slice(1, 1, None)], 3: [slice(1, 1, None), slice(1, 1, None), slice(1, 1, None), slice(1, 1, None), slice(1, 1, None)], 4: [slice(1, 1, None), slice(1, 1, None), slice(1, 1, None), slice(1, 1, None), slice(1, 1, None)], 5: [slice(1, 1, None), slice(1, 1, None), slice(1, 1, None), slice(1, 1, None), slice(1, 1, None)]}

【讨论】:

  • 我怎样才能更进一步并为我的值运行一个 for 循环?
  • @Pikachu 我不太明白后续问题。请问您可以通过添加minimal reproducible example 来解决您的问题吗?
  • @Pikachu:你想要这样的东西吗:d = {a:list(range(1, 4)) for a in range(6)}
  • @DeepSpace 是的,我做了,我编辑了 OP。对此感到抱歉。
猜你喜欢
  • 2017-11-23
  • 1970-01-01
  • 2023-04-01
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2013-12-28
相关资源
最近更新 更多