将列表与元组列表组合在一起

时间:2015-05-30 04:21:22

标签: python list

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 个答案:

答案 0 :(得分:8)

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

Java.lang.Class.getDeclaredFields()

如您的示例所示,第二个列表与第一个列表相比具有额外的维度,

  1. 将第一个列表转换为与第二个列表匹配的较高维度
  2. 减少第二个列表的维度
  3. 在这种特殊情况下,第一种方法更容易,因此是显而易见的选择

答案 1 :(得分:4)

 <packagingExcludes>app/*/*.js</packagingExcludes> 

答案 2 :(得分: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),第二次中的2(30, 40)等等。

然后,您可以重新调整值以创建所需的元组。您可以使用(a, b[0], b[1])(a, ) + b执行此操作。 Abhijit使用的后一种方法可能比我的方法更有效,这是基于你可以添加元组的事实(例如(1, 2) + (3, 4) + (5,)等于(1, 2, 3, 4, 5))。

如果你想对数字做什么并不是太复杂,你可以在for表达式的开头而不是仅仅创建元组。也许你可以通过这种方式使你的代码更紧凑。

答案 3 :(得分: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()类似于map(),初始参数为None。使用单个序列参数,它返回一个1元组的列表。没有参数,它返回一个空列表。

答案 4 :(得分:1)

假设len(l1)== len(l2)

,只需用显式for循环放下另一种方式
for x in range(0,len(l1)):
    print (l1[x],l2[x][0],l2[x][1])