Python:合并字典列表

时间:2012-08-15 10:41:29

标签: python list dictionary merge iterator

我在词典中有列表:

Number_of_lists=3           #user sets this value, can be any positive integer
My_list={}
for j in range(1,Number_of_lists+1):
  My_list[j]=[(x,y,z)]  

Number_of_lists是用户设置的变量。如果事先不知道用户设置的值,我想最终得到所有字典列表的合并列表。例如,如果Number_of_lists=3且相应的列表为My_list[1]=[(1,2,3)]My_list[2]=[(4,5,6)]My_list[3]=[(7,8,9)],则结果为:

All_my_lists=My_list[1]+My_list[2]+My_list[3]

其中: All_my_lists=[(1,2,3),(4,5,6),(7,8,9)]

所以我要做的就是尽可能自动执行上述程序:

Number_of_lists=n #where n can be any positive integer

我现在有点迷失,试图使用迭代器添加列表并始终失败。我是一个蟒蛇初学者,这是我的一个爱好,所以如果你回答请解释你的答案中的一切我正在做这个学习,我不是要求你做我的作业:)

修改

@codebox(请看下面的评论)正确地指出我的代码中显示的My_List实际上是字典而不是列表。如果您使用任何代码,请小心。

4 个答案:

答案 0 :(得分:1)

如果您只关心最终列表,并且实际上不需要My_list(您应该重命名,因为它是一本字典!)那么您可以这样做:

Number_of_lists=3
result = []
for j in range(1,Number_of_lists+1):
    result += (x,y,z)

答案 1 :(得分:1)

使用列表理解:

>>> Number_of_lists=3 
>>> My_list={}
>>> for j in range(1,Number_of_lists+1):
      My_list[j]=(j,j,j)
>>> All_my_lists=[My_list[x] for x in My_list]

>>> print(All_my_lists)
[(1, 1, 1), (2, 2, 2), (3, 3, 3)]

All_my_lists=[My_list[x] for x in My_list]相当于:

All_my_lists=[]
for key in My_list:
   All_my_lists.append(My_list[key])

答案 2 :(得分:1)

首先生成All_my_lists可能更容易,然后My_list生成。

构建All_my_lists

使用list comprehensionrange()生成All_my_lists

>>> num = 3  # for brevity, I changed Number_of_lists to num
>>> All_my_lists = [tuple(range(num*i + 1, num*(i+1) + 1)) for i in range(0, num)]
>>> All_my_lists
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]

或者,我们可以使用itertools recipe列表中的grouper()函数,这样可以生成更清晰的代码:

>>> All_my_lists = list(grouper(num, range(1, num*3+1)))
>>> All_my_lists
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]

构建My_lists

然后我们可以使用dict constructor以及列表理解和enumerate()My_list构建派生All_my_list

>>> My_lists = dict((i+1, [v]) for i,v in enumerate(All_my_lists))
>>> My_lists
{1: [(1, 2, 3)], 2: [(4, 5, 6)], 3: [(7, 8, 9)]}
>>> My_lists[1]
[(1, 2, 3)]
>>> My_lists[2]
[(4, 5, 6)]
>>> My_lists[3]
[(7, 8, 9)]

答案 3 :(得分:1)

您可以尝试使用Number_of_listsrange转换为一系列密钥,然后使用map选择字典,尝试更实用的方法:

My_list={1:[1,2,3], 2:[4,5,6], 3:[7,8,9], 4:[10,11,12]}
Number_of_lists=3
All_my_lists=map(lambda x: tuple(My_list[x]), range(1, Number_of_lists+1))

示例输出:

>>> All_my_lists
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]