如何压缩两个列表,其中一个列表只包含一个项目

3

我有两个列表:

list1 = [1,2,3]

并且

list2 = [4]

我需要将它们组合起来,以产生以下输出:
list3 = [[1,4],[2,4],[3,4]]

itertools似乎没有一种方法可以实现这一点,zip函数在第二个列表结束时结束。

我相信有一个一行代码的解决方案,但我在这里和谷歌上找到了太多类似但不完全相同的问题。


当第二个列表结束时,zip函数也会结束...使用zip_longest函数可以实现+1的效果。 - progmatico
5个回答

6
您可以遍历列表并将list2的值和当前迭代的元素连接起来:
list1 = [1,2,3]
list2 = [4]
new_list = [[a]+list2 for a in list1]

输出:

[[1, 4], [2, 4], [3, 4]]

或者,另一种使用map的低级解决方案:
final_list = map(lambda x:[x, list2[0]], list1)

输出:

[[1, 4], [2, 4], [3, 4]]

我运行了一些计时,你的第一个解决方案是最快的(也许并不令人惊讶)。 - Anton vBR
@AntonvBR 列表推导式在较短的示例中比 map 更快,但是当使用 lambda 函数时(如在此情况下),map 几乎总是更慢。我将编辑帖子以提到这一点。 - Ajax1234

6

我祝你圣诞快乐!感谢您所有的评论和支持。祝你好运,愉快的一天!小礼物,3plus ;) - jezrael
1
@jezrael 哈哈哈哈。你真好。你让我微笑并思考在SO上帮助人们并学习的美好之处。圣诞快乐和新年快乐。(顺便说一句,你的超快速回复已经触达了更多的人。我也会找一些帖子点赞!!! - Anton vBR

3

你需要第三种选择吗?

>>> list(map(list,zip(list2 * len(list1), list1)))
[[4, 1], [4, 2], [4, 3]]

我已经擅自编辑了关于列表的列表的答案。 - Anton vBR
1
@AntonvBR:谢谢!完全没注意到。 - Bill Bell

0
你也可以尝试使用 itertools.cycle()
>>> import itertools    
>>> list1 = [1,2,3]
>>> list2 = [4]
>>> print([list(x) for x in zip(list1, itertools.cycle(list2))])
[[1, 4], [2, 4], [3, 4]]

-1
你是否正在寻找类似这样的东西?
没有任何外部模块或繁重的代码:
print(list(map(lambda x:[x,list2[0]],list1)))

当数据为:

list1 = [1,2,3]
list2 = [4]

输出:

[[1, 4], [2, 4], [3, 4]]

正如有人指出的那样,这已经是给出的答案了,这是另一种解决方案:

list1 = [1,2,3]
list2 = [4]

print(list(zip(list1,list2*len(list1))))

输出:

[(1, 4), (2, 4), (3, 4)]

@AntonvBR,感谢你在投反对票方面付出了努力,但我没有看到。 - Aaditya Ura
没关系,有时候会发生这种情况。但是如果你的答案完全相同,最好把它删除掉。 - Anton vBR

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