【问题标题】:How to merge lists into a list of tuples?如何将列表合并到元组列表中?
【发布时间】:2011-01-25 07:55:38
【问题描述】:

实现以下目标的 Pythonic 方法是什么?

# Original lists:

list_a = [1, 2, 3, 4]
list_b = [5, 6, 7, 8]

# List of tuples from 'list_a' and 'list_b':

list_c = [(1,5), (2,6), (3,7), (4,8)]

list_c 的每个成员都是一个元组,其第一个成员来自list_a,第二个成员来自list_b

【问题讨论】:

    标签: python list merge tuples


    【解决方案1】:

    像我一样,如果有人需要将其转换为列表列表(二维列表)而不是元组列表,那么您可以执行以下操作:

    list(map(list, list(zip(list_a, list_b))))
    

    它应该返回一个二维列表,如下所示:

    [[1, 5], 
     [2, 6], 
     [3, 7], 
     [4, 8]]
    

    【讨论】:

      【解决方案2】:

      map 解包:

      >>> list(map(lambda *x: x, list_a, list_b))
      [(1, 5), (2, 6), (3, 7), (4, 8)]
      >>> 
      

      【讨论】:

        【解决方案3】:

        在 Python 2 中:

        >>> list_a = [1, 2, 3, 4]
        >>> list_b = [5, 6, 7, 8]
        >>> zip(list_a, list_b)
        [(1, 5), (2, 6), (3, 7), (4, 8)]
        

        在 Python 3 中:

        >>> list_a = [1, 2, 3, 4]
        >>> list_b = [5, 6, 7, 8]
        >>> list(zip(list_a, list_b))
        [(1, 5), (2, 6), (3, 7), (4, 8)]
        

        【讨论】:

        • 您必须知道 zip 函数会在最短列表的末尾停止,这可能并不总是您想要的。 itertools 模块定义了一个 zip_longest() 方法,该方法停在最长列表的末尾,用您提供的参数填充缺失值。
        • @Adrien:为您的适用评论干杯。对于 Python 2.x,s/zip_longest()/izip_longest()。在 Python 3.x 中重命名为 zip_longest()
        • 我可以创建 [(1,5), (1,6), (1,7), (1,8), (2,5), (2,6) 等等] 使用 zip 命令?
        • @MonaJalal:不,这不是配对,而是创建列表的 productitertools.product() 这样做。
        • 注意,至少在python3.6 zip 中不返回列表。所以你需要 list(zip(list_a,list_b)) 代替
        【解决方案4】:

        我不确定这是否是一种 pythonic 方式,但如果两个列表具有相同数量的元素,这似乎很简单:

        list_a = [1, 2, 3, 4]
        
        list_b = [5, 6, 7, 8]
        
        list_c=[(list_a[i],list_b[i]) for i in range(0,len(list_a))]
        

        【讨论】:

          【解决方案5】:

          不使用zip的另一种选择:

          list_c = [(p1, p2) for idx1, p1 in enumerate(list_a) for idx2, p2 in enumerate(list_b) if idx1==idx2]
          

          如果一个人不仅想获得 1st 和 1st 的元组,2nd 和 2nd 的元组......而且这 2 个列表的所有可能组合,那么可以使用

          list_d = [(p1, p2) for p1 in list_a for p2 in list_b]
          

          【讨论】:

            【解决方案6】:

            您在问题陈述中显示的输出不是元组而是列表

            list_c = [(1,5), (2,6), (3,7), (4,8)]
            

            检查

            type(list_c)
            

            考虑到您希望结果是 list_a 和 list_b 中的元组,这样做

            tuple(zip(list_a,list_b)) 
            

            【讨论】:

            • 从我的角度来看,这似乎是我正在寻找的东西,并且适用于两者(列表和元组)。因为当您使用 print 时,您将看到正确的值(正如 @cyborg 和 @Lodewijk 所期望和提到的),并且没有与 object 相关的任何内容,例如:<map object at 0x000001F266DCE5C0><zip object at 0x000002629D204C88>。至少,关于 mapzip(单独)的解决方案对我来说似乎不完整(或太复杂)。
            • 问题表明他们想要一个元组列表而不是元组的元组。
            【解决方案7】:

            您可以使用地图 lambda

            a = [2,3,4]
            b = [5,6,7]
            c = map(lambda x,y:(x,y),a,b)
            

            如果原始列表的长度不匹配,这也可以工作

            【讨论】:

            • 为什么要使用 lambda? map(None, a,b)
            • 我只能访问python 3.5。
            • 如果您使用的是 python3,那么 c 将不是一个列表,而是一个地图对象,如果您有不同长度的列表和想要处理,那么你会使用 izip_longest/zip_longest
            • “原始列表长度不匹配”时不起作用。
            • 在 [56] 中:a = ("a","b","c","d","e") 在 [57] 中:b = (1,2,3, 4,5,6,7,8,9,10) 在 [58]: s = list(map(lambda x,y:(x,y),a,b)) 在 [59]: print(s) [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)] 错过匹配长度对我来说没问题
            【解决方案8】:

            我知道这是一个老问题并且已经得到解答,但出于某种原因,我仍然想发布这个替代解决方案。我知道很容易找出哪个内置函数可以实现您需要的“魔法”,但知道您可以自己完成它并没有什么坏处。

            >>> list_1 = ['Ace', 'King']
            >>> list_2 = ['Spades', 'Clubs', 'Diamonds']
            >>> deck = []
            >>> for i in range(max((len(list_1),len(list_2)))):
                    while True:
                        try:
                            card = (list_1[i],list_2[i])
                        except IndexError:
                            if len(list_1)>len(list_2):
                                list_2.append('')
                                card = (list_1[i],list_2[i])
                            elif len(list_1)<len(list_2):
                                list_1.append('')
                                card = (list_1[i], list_2[i])
                            continue
                        deck.append(card)
                        break
            >>>
            >>> #and the result should be:
            >>> print deck
            >>> [('Ace', 'Spades'), ('King', 'Clubs'), ('', 'Diamonds')]
            

            【讨论】:

            • 更改一个输入列表(如果它们的长度不同)并不是一个好的副作用。另外,if-elif 中对card 的两个赋值是不需要的,这就是你有continue 的原因。 (事实上​​,如果没有continue,您就不必更改列表:应该保留前面提到的两个分配,并分别变为card = (list_1[i], '')card = ('', list_2[1])。)
            【解决方案9】:

            在 python 3.0 中,zip 返回一个 zip 对象。你可以通过调用list(zip(a, b))获取一份清单。

            【讨论】:

            • 这可能是微不足道的,但请注意,直接在 for 循环中使用它会给你一个生成器,使用一次后就会耗尽。如果您想更频繁地使用它,请保存到变量中
            【解决方案10】:

            您正在寻找内置函数zip

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-11-11
              • 1970-01-01
              • 2021-09-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-10-08
              相关资源
              最近更新 更多