如何在列表

时间:2017-10-10 09:06:07

标签: python dictionary dictionary-comprehension

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

[{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中的键是相同的,但值必须不同。

4 个答案:

答案 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中的最后一个字典分配给01,它将替换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))]