繁体   English   中英

如何在列表中插入指向多个字典的字典

[英]How can I insert a dictionary that points to multiple dictionaries inside a list

任何人都可以帮助我使用以下代码:

[{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:指向的第二个 dict 也在0:点重复? 我怎样才能阻止这种情况的发生并使两个嵌套的字典都具有独立的值。 两个嵌套字典中的键相同,但值必须不同。

你把事情复杂化了。 只需使用enumerate()函数,它就会生成开箱即用的键值对:

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中的字典不会被复制; 如果这是一个问题,您可以在dict.copy使用map()

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()就足够了。 我也不知道你为什么把最终结果放在一个列表中。

你想要的输出的小问题。 你想要一本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提供了更短的方法。 也检查一下。

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

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

其中arg是您的预定义字典。

编辑:上面的用户Martijn Pieters是一种巧妙的方法!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM