任何人都可以帮助我使用以下代码:
[{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"}]
Im寻找的输出是:
[0: {"key1": "val1", "key2": "val2"}, 1: {"key1": "val3", "key2": "val4"}]
当我运行上述词典理解时,我得到了
[0: {"key1": "val3", "key2": "val4"}, 1: {"key1": "val3", "key2": "val4"}]
为什么1:
指向的第二个词也会在0:
点重复出现?我怎样才能阻止这种情况的发生,并使嵌套的dicts具有独立的值。嵌套dicts中的键是相同的,但值必须不同。
答案 0 :(得分: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
中的最后一个字典分配给0
和1
,它将替换arg
中的任何其他字典(其中每个也分配给所有整数键之前)。
您也不需要使用{x: y for x, y in b.items()}
,只需b.copy()
就足够了。我也不确定你为什么把最终结果列入清单。
答案 1 :(得分:0)
您想要的输出小问题。你想要Dictionary
Im寻找的输出是:
[0:{" key1":" val1"," key2":" val2"},1:{&#34 ; key1":" val3"," key2": " VAL4"}]
是list
。因此,有效输出应为:
{0:{' key1':' val1',' key2':' val2'},1:{&#39 ; key1':' val3',' key2': ' VAL4'}}
通过以下方式获取:
{ i:l[i] for i in range(len(l)) }
# OR
{ i:key for i,key in enumerate(l) }
#driver values
IN : l = [{"key1":"val1", "key2":"val2"}, {"key1":"val3", "key2":"val4"}]
OUT : {0: {'key1': 'val1', 'key2': 'val2'}, 1: {'key1': 'val3', 'key2': 'val4'}}
修改:Martijn Pieters使用enumerate
提供更短的方法。看看吧。
答案 2 :(得分:0)
如果我正确解释了这个,你需要一本字典词典。这样就可以了:
{index: val.copy() for index, val in enumerate(arg)}
arg
是您预定义的词典。
编辑:上面提到的用户Martijn Pieters是一种巧妙的方法!
答案 3 :(得分:0)
您的代码非常复杂。怎么样:
[{k: arg[k]} for k in range(len(arg))]