【问题标题】:How can I insert a dictionary that points to multiple dictionaries inside a list如何在列表中插入指向多个字典的字典
【发布时间】:2017-10-10 09:06:06
【问题描述】:

谁能帮我写下以下代码:

[{k: {x: y for x, y in b.items()} for b in arg for k in range(len(arg))}]

arg 在哪里:

arg = [{"key1": "val1", "key2": "val2"}, {"key1": "val3", "key2": "val4"}]

我正在寻找的输出是:

[0: {"key1": "val1", "key2": "val2"}, 1: {"key1": "val3", "key2": "val4"}]

当我运行上面的dict理解时,我得到了

[0: {"key1": "val3", "key2": "val4"}, 1: {"key1": "val3", "key2": "val4"}]

为什么1: 指向的第二个字典也会在0: 位置重复?我怎样才能阻止这种情况的发生,并让嵌套的 dicts 具有它们的独立值。两个嵌套字典中的键相同,但值必须不同。

【问题讨论】:

  • 您在kb 上有一个双循环。相反,您需要一个循环 for k,b in enumerate(arg)
  • 您要查找的输出不是有效的 Python 对象...您在 arg 中有错字(逗号必须是分号)
  • 恕我直言,您的逻辑太复杂,无法理解。它不再可读,并且:“可读性很重要。” ——Python之禅
  • @Klaus {k:b for k,b in enumerate(arg)} 会更简单;)
  • dict(enumerate(arg)) 会做你想做的事。

标签: python dictionary dictionary-comprehension


【解决方案1】:

你把事情弄得太复杂了。只需使用enumerate() function,它会生成您的键值对开箱即用

dict(enumerate(arg))

dict() 采用可迭代的键值对:

>>> arg = [{"key1": "val1", "key2": "val2"}, {"key1": "val3", "key2": "val4"}]
>>> dict(enumerate(arg))
{0: {'key1': 'val1', 'key2': 'val2'}, 1: {'key1': 'val3', 'key2': 'val4'}}

arg中的字典不会被复制;如果这是个问题,您可以使用 map() 而不是 dict.copy

dict(enumerate(map(dict.copy, arg)))

或使用单个字典理解:

{i: a.copy() for i, a in enumerate(arg)}

您的代码创建了一个双循环;你实际上是在这样做:

_dictionary = {}
for b in arg:
    for k in range(len(arg)):
        _dictionary[k] = {x: y for x, y in b.items()}
result = [_dictionary]

所以为arg 中的每个字典创建另一个 循环并重复为b 创建字典。 k 的最后一个这样的字典将获胜,并且由于 arg 中的最后一个字典被分配给 01 它会替换 arg 中的任何其他字典(其中每个字典也分配给所有整数键之前)。

您也不需要使用{x: y for x, y in b.items()},只需b.copy() 就足够了。我也不确定您为什么将最终结果放入列表中。

【讨论】:

  • 感谢您解释得这么好。我没有想过枚举功能。再次感谢!
【解决方案2】:

如果我的解释正确,您需要一本字典。这将做到这一点:

{index: val.copy() for index, val in enumerate(arg)}

arg 是您的预定义字典。

编辑:上面的用户Martijn Pieters 是这样做的好方法!

【讨论】:

    【解决方案3】:

    您的代码相当复杂。怎么样: [{k: arg[k]} for k in range(len(arg))]

    【讨论】:

      【解决方案4】:

      你想要的输出的小问题。你想要一个Dictionary 而你的

      我正在寻找的输出是:

      [0:{“key1”:“val1”,“key2”:“val2”},1:{“key1”:“val3”,“key2”: "val4"}]

      list。所以,有效的输出应该是:

      {0: {'key1': 'val1', 'key2': 'val2'}, 1: {'key1': 'val3', 'key2': 'val4'}}

      通过以下方式获得:

      { i:l[i] for i in range(len(l)) }
      
      # OR
      
      { i:key for i,key in enumerate(l) }
      

      #驱动值

      IN : l = [{"key1":"val1", "key2":"val2"}, {"key1":"val3", "key2":"val4"}]
      OUT : {0: {'key1': 'val1', 'key2': 'val2'}, 1: {'key1': 'val3', 'key2': 'val4'}}
      

      编辑:Martijn Pieters 使用enumerate 提供更短的方法。也来看看吧。

      【讨论】:

        猜你喜欢
        • 2022-10-18
        • 2021-06-27
        • 1970-01-01
        • 2018-06-03
        • 2019-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多