在Python中列表的组合

3

我得到了一个像这样的Python列表:

[1,2,3,4]

我希望你能将数字3与所有数字进行组合,类似于以下内容:

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

有没有什么工具可以用?我知道有一个叫itertools的库,但是我还是新手,不太清楚如何使用。

谢谢!


itertools组合和排列有很好的文档支持,并且在这个网站上有许多示例。不妨尝试一下。 - Chris
你不需要使用 itertools 来完成这个任务。 - Sayandip Dutta
你想要这个输出吗:[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)] - kederrac
不是完全一样,只是将一个位置(在这种情况下为3)移动到其他位置。 - Carlos Eduardo Corpus
是的,(4,3) 作为一个元素也可以。 - Carlos Eduardo Corpus
显示剩余2条评论
4个回答

1
您可能想要使用列表推导式:
orig_list = [1,2,3,4]
[(entry, 3) for entry in orig_list if entry != 3] # [(1, 3), (2, 3), (4, 3)]

如果您不需要重复值,可以将其转换为一个集合:
orig_list = set([1,2,3,4])
[(entry, 3) for entry in orig_list if entry != 3] # [(1, 3), (2, 3), (4, 3)]

通常情况下,如果您不想使用某个变量,可以将其命名为“_”作为变量。 - kederrac
这很棒,它帮助了我很多,谢谢!如果我还想要另一个位置怎么办?不仅仅是(1,3),还有(3,1)? - Carlos Eduardo Corpus

1
一种简单的方法是使用循环:

list2 = []
for x in list1:
     list2.append((x,3))
print(list2)

如果你想要去掉 (3,3),请使用:

list2 = []
for x in list1:
     if x != 3:
          list2.append((x,3))
print(list2)

1

您可以使用列表推导式和itertools.combinations

import itertools

[e for e in itertools.combinations([1,2,3,4], 2) if 3 in e]

输出:

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

更好的方法是使用itertools.repeat:
from itertools import repeat

l = [1,2,3,4]
[(f, s) for f, s in zip(l, repeat(3)) if f != 3]

输出:

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

注意:这将把一个 O(n) 的问题转化为一个 O(n²) 的问题(n 选 2 是 n * (n - 1) / 2 的工作量);对于你生成的每个值,你都必须过滤掉 ~`n`。如果输入长度为 4,那么还好,但如果长度为 1000,则不太好。 - ShadowRanger
1
我的第二种解决方案时间复杂度为O(n),应该完全没有问题,甚至可能是最快的。 - kederrac

0

你可以使用:

l = [1,2,3,4]
[(l[i], 3) for i in range(l.index(3))] + [(3, l[i]) for i in range(l.index(3)+1, len(l))]

这会产生以下输出:

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

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