【问题标题】:What is the for loop for this dictionary comprehension?这个字典理解的 for 循环是什么?
【发布时间】:2021-12-15 00:01:36
【问题描述】:

我有以下 dict 理解,但我不知道如何将其转换回 for 循环。

Value = [1,2,3,4,5]
Key = ['a','b','c','a','c']
{k: [Value[i] for i in [j for j, x in enumerate(Key) if x == k]] for k in set(Key)}

我试过了:

d1 = {}
for k in set(Key):
    for i in [j for j, x in enumerate(Key) if x == k]:
        d1[k].append(Value[i])   

但这显然是错误的。 谢谢!

【问题讨论】:

  • 什么是Key?另外,Value 是什么?
  • 对不起。我添加了它们。 Key 和 Value 是两个列表。

标签: python


【解决方案1】:

您只需将d1[k] 创建为一个列表。

for k in set(Key):
    d1[k] = []
    ...

虽然,内部列表推导是多余的:它所做的只是将j 重命名为i。你也可以打开它:

for k in set(Key):
    d1[k] = []
    for i, x in enumerate(Key):
        if x == k:
            d1[k].append(Value[i])

也就是说,整个事情都过于复杂,使用zip 可以更轻松地完成:

d1 = {}
for k, v in zip(Key, Value):
    values = d1.setdefault(k, [])
    values.append(v)
print(d1)  # -> {'a': [1, 4], 'b': [2], 'c': [3, 5]}

虽然,如果不能保证 KeyValue 的长度相同,这可能会静默失败。为避免这种情况,在 Python 3.10+ 中您可以使用 zip(Key, Value, strict=True),否则您可以将其改写为 for i, k in enumerate(Key) ... values.append(Values[i])

注意:在 Python 3.7+ 中,由于 set 转换,此解决方案 preserves insertion order 而不是您的解决方案。

【讨论】:

    【解决方案2】:

    考虑问题中的以下代码:

    {k: [Value[i] for i in [j for j, x in enumerate(Key) if x == k]] for k in set(Key)}
    

    它可能是一个非常棒的单线,但对于任何人来说,它的作用并不是很明显。事实上,我花了一些时间来弄明白它是如何工作的,但我仍然没有完全理解它。

    在这种情况下,我建议对其进行简化,也许将其拆分为几行额外的行,以便其他人和您自己更清楚发生了什么。例如,考虑以下带有defaultdict 的示例,它是dict 的子类:

    my_dict = defaultdict(list)
    for k, v in zip(Key, Value):
        my_dict[k].append(v)
    

    my_dict 的结果,同样包含相同的内容:

    defaultdict(<class 'list'>, {'a': [1, 4], 'b': [2], 'c': [3, 5]})
    

    【讨论】:

      【解决方案3】:

      我不确定 Value 之前声明的内容,但 dict 理解相当于:

      d1 = {}
      for k in set(Key):
          d1[k] = []
      
          for i in [j for j, x in enumerate(Key) if x == k]:
              d1[k].append(Value[i])
      

      您需要先将d1[k] 设置为一个空列表。

      【讨论】:

        猜你喜欢
        • 2019-10-05
        • 2019-03-03
        • 2019-04-19
        • 1970-01-01
        • 1970-01-01
        • 2013-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多