如何将列表合并到元组列表中?

Posted

技术标签:

【中文标题】如何将列表合并到元组列表中?【英文标题】: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

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于如何将列表合并到元组列表中?的主要内容,如果未能解决你的问题,请参考以下文章

将列表作为单个元素插入到元组中

Scala:将 Map 映射到元组列表

scala zip列表到元组

在 Python 中查找输入字符串到元组列表的所有可能匹配项(以任何顺序/顺序)

Python列表操作:将前任和后继组合到元组中

附加到元组中定义的列表 - 这是一个错误吗? [复制]