将列表与元组列表相结合

3
l1 = [1, 2, 3, 4]
l2 = [(10, 20), (30, 40), (50, 60), (70, 80)]

>>> print(list(zip(l1, l2)))

[(1, (10, 20)), (2, (30, 40)), (3, (50, 60)), (4, (70, 80))]

然而,我希望它只是一个包含四个元组的列表,如下所示:
[(1, 10, 20), (2, 30, 40), (3, 50, 60), (4, 70, 80)]

我也尝试过以下方法:
>>> print(list(zip(l1, *l2)))

[(1, 10, 30, 50, 70), (2, 20, 40, 60, 80)]

我的问题是:

我如何将一个列表与一个元组列表或一个列表列表压缩在一起?

5个回答

8

一种更通用的方法来解决这个问题是考虑将两个列表在需要时按比例放大/缩小到相同的维度。

>>> [(a, ) + b for a, b in zip(l1, l2)]
[(1, 10, 20), (2, 30, 40), (3, 50, 60), (4, 70, 80)]

就像你的例子一样,与第一个列表相比,第二个列表具有额外的维度,可以采取以下两种方法:

  1. 将第一个列表转换为匹配第二个列表的更高维度
  2. 减少第二个列表的维度

在这种特殊情况下,第一种方法更容易实现,是显然的选择。


虽然这并没有产生期望的输出。(我还要指出,在Python 2中,zip只返回一个list)。 - TigerhawkT3
修复后的版本很好。我不知道 tuple 有一个等同于 list__add__ - TigerhawkT3
你可以在这里阅读关于zip()的内容。 - TigerhawkT3
很好。但是有没有不使用zip函数的方法? - Rockbar

4
>>> l1=[1,2,3,4]
>>> l2=[(10,20),(30,40),(50,60),(70,80)]
>>> [tuple([x] + list(y)) for x,y in zip(l1,l2)]
[(1, 10, 20), (2, 30, 40), (3, 50, 60), (4, 70, 80)]

1
你需要。
l1 = [1, 2, 3, 4]
l2 = [(10, 20), (30, 40), (50, 60), (70, 80)]
print [(a, b[0], b[1]) for a, b in list(zip(l1, l2))]

这是它的工作方式:zip 创建一个数组,将l1l2的元素组合在一起。
>>> zip (l1, l2)
[(1, (10, 20)), (2, (30, 40)), (3, (50, 60)), (4, (70, 80))]

for i, j in zip(l1, l2)将按顺序从每个数组中选取一个元素,分别赋值给i和j;例如,在第一次迭代中,1(10, 20)被分别赋值给i和j,在第二次迭代中,2(30, 40)被分别赋值给i和j,以此类推。

然后,您可以重新排列这些值,创建所需的元组。您可以使用(a, b[0], b[1])或者(a, ) + b来实现。后者是Abhijit使用的方法,可能比我的方法更有效率,因为它基于这样一个事实:您可以将元组相加(例如,(1, 2) + (3, 4) + (5,)等于(1, 2, 3, 4, 5))。

如果您想对数字进行的操作不是过于复杂,您可以在for表达式的开头就完成操作,而不仅仅是创建元组。也许这样可以使您的代码更加简洁。


@Alexander,请停止对每个人的帖子进行不必要的编辑。 - TigerhawkT3
@TigerhawkT3 Python的禅宗原则:“可读性至上。” - Alexander
2
它已经足够易读了,我们所做的只是将这些行复制并粘贴。这并不是一种改进。 - TigerhawkT3
复制垃圾,粘贴垃圾。你可能至少要花时间编辑你复制的内容。 - Alexander
2
没有必要。如果您的编辑进入了审核队列,它们将被拒绝,因为没有改进。 - TigerhawkT3
使结果更易读的问题在哪里?我这样做不是为了得分... - Alexander

1
如果让我做这件事,它会像下面这样:
l1 = [1, 2, 3, 4]
l2 = [(10, 20), (30, 40), (50, 60), (70, 80)]

print [ (a,b[0],b[1]) for a, b in zip(l1, l2)]

所以你需要知道如何使用 zip():

这个函数返回一个元组列表,其中第i个元组包含每个参数序列或可迭代对象的第i个元素。返回的列表长度被截断为最短参数序列的长度。当有多个参数具有相同的长度时,zip()类似于带有初始参数None的map()。对于单个序列参数,它返回一个1元素元组的列表。没有参数时,返回一个空列表。


1

只是用显式的for循环另一种方式来表达,假设len(l1) == len(l2)

for x in range(0,len(l1)):
    print (l1[x],l2[x][0],l2[x][1])

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