Python:合并字典列表

5

我有一个字典里面嵌套了列表:

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 #其中n可以是任何正整数

我一直在尝试使用迭代器将这些列表相加,但总是失败。我是python初学者,这是我的业余爱好,如果您回答,请解释您的答案中的每个细节,我这样做是为了学习,不是要求您帮我做作业 :)

编辑

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

4个回答

1

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

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

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])

1
这对于这种情况和手头的特定Python实现可能是可以的,但一般来说,不能假设字典的键列表(由"for x in My_list"返回)在每个字典长度或特定的Python解释器/平台上都是按排序顺序排列的。 - Benedict

1

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

生成All_my_lists

使用列表推导式range()来生成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构造函数以及列表推导式和enumerate()来从All_my_list派生出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)]

1

您可以尝试更加实用的方法,通过使用rangeNumber_of_lists转换为键序列,并使用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)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接