【问题标题】:Python: Merging dictionary listsPython:合并字典列表
【发布时间】:2012-08-11 16:00:36
【问题描述】:

我在字典中有列表:

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

到目前为止,我有点迷失了,试图使用迭代器来添加列表并且总是失败。我是 python 初学者,这是我的一个爱好,所以如果你回答,请解释你的答案中的所有内容,我这样做是为了学习,我不是要求你做我的作业:)

编辑

@codebox(请看下面的 cmets)正确指出我的代码中显示的 My_List 实际上是字典而不是列表。使用任何代码时要小心。

【问题讨论】:

    标签: python list dictionary merge iterator


    【解决方案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])
    

    【讨论】:

    • 这对于这种情况和手头的特定 python 实现可能很好,但一般不能假设字典的键列表(由“for x in My_list”返回)是按每个 dict 长度或特定 python 解释器/平台的排序顺序。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您可以尝试更实用的方法,使用 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)]
      

      【讨论】:

        【解决方案4】:

        先生成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()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)]
        

        【讨论】:

          猜你喜欢
          • 2012-07-17
          • 2021-10-06
          • 2013-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-10
          • 2016-02-22
          相关资源
          最近更新 更多