将N个项目反复添加到列表中,最后一个N次给出了该项目

问题描述 投票:0回答:3

我正在访问词典项目list_of_dict = [{'ka':'1a', 'kb':'1b', 'kc':'1c'},{'ka':'2a'},{'ka':'3a', 'kb':'3b', 'kc':'3c'}]的列表,并尝试使用函数article_list有条件地将每个条目附加到另一个列表add_entries

我想要的输出

article_list = [{x:1a, y:1b, z:1c}, {x:2a}, {x:3a, y:3b, z:3c}]

我的代码:


def add_entries(list_of_dict):
   keys = ['x','y','z']
   #defining a temporary dictionary here
   my_dict = dict.fromkeys(keys,0)
   entry_keys = ['ka','kb','kc']

   my_list = []

   for item in list_of_dict:
    # conditionally append the entries into the temporary dictionary maintaining desired key names
        my_dict.update({a: item[b] for a,b in zip(keys, entry_keys) if b in item})
        my_list.append(my_dict)

   return my_list



if __name__ == "__main__":
   list_of_dict = [{'ka':'1a', 'kb':'1b', 'kc':'1c'},{'ka':'2a'},{'ka':'3a', 'kb':'3b', 'kc':'3c'}]
   article_list = []
   returned_list = add_entries(list_of_dict)
   article_list.extend(returned_list)

我的输出

article_list = [{x:3a, y:3b, z:3c}, {x:3a, y:3b, z:3c}, {x:3a, y:3b, z:3c}]
python list function dictionary append
3个回答
0
投票

您可以使用它。

keys=['x','y','z']
res=[{k1:d[k]} for d in list_of_dict for k,k1 in zip(d,keys)]

输出

[{'x': '1a'},
 {'y': '1b'},
 {'z': '1c'},
 {'x': '2a'},
 {'x': '3a'},
 {'y': '3b'},
 {'z': '3c'}]

0
投票

尝试一下:

list_new_d=[]
for d in list_of_dict:
  new_d={}

  for k,v in d.items():
    if k == 'ka':
      new_d['x'] = v

    if k == 'kb':
      new_d['y'] = v

    if k == 'kc':
      new_d['z'] = v
  list_new_d.append(new_d)


0
投票

怎么了

my_list.append(my_dict)my_dict对象的my_list对象附加reference。因此,在您的示例的for循环末尾,my_list是内存中完全相同的字典的引用列表。

您可以使用功能id亲自查看。至少在CPython中,id基本上为您提供了对象的内存地址。如果您这样做

article_list.extend(returned_list)
print([id(d) for d in article_list])

您将获得相同内存地址的列表。在我的机器上,我得到

[139920570625792, 139920570625792, 139920570625792]

结果是更新字典会影响列表中的“所有字典”。 (之所以如此,是因为您的列表中实际上没有字典,只是引用了完全相同的字典)。因此最后,您只能看到最后的更新操作。

可以在此答案https://stackoverflow.com/a/30340596/8791491中找到有关Python中的引用和对象的很好的讨论

修复

my_dict循环内移动for的定义,这意味着您会为my_list的每个元素获得一个新的单独的词典。现在,更新操作将不会影响列表中的其他词典,并且my_list是对多个不同词典的引用的列表。

def add_entries(list_of_dict):
    keys = ['x','y','z']
    entry_keys = ['ka','kb','kc']

    my_list = []

    for item in list_of_dict:
        #defining a new dictionary here
        my_dict = dict.fromkeys(keys,0)

        # conditionally append the entries into the temporary dictionary maintaining desired key names
        my_dict.update({a: item[b] for a,b in zip(keys, entry_keys) if b in item})
        my_list.append(my_dict)

    return my_list
© www.soinside.com 2019 - 2024. All rights reserved.