比较排列和组合

1 投票
1 回答
1524 浏览
提问于 2025-04-18 09:49

我有一个很大的列表,里面包含了所有可能的组合。

items = ["Apple","Banana","Orange","Peach"]
combs = []
for c in combinations(items, 2)):
    combs.append([c[0],c[1]])

这个列表生成了:

[['Apple', 'Banana'], ['Apple', 'Orange'], ['Apple', 'Peach'], ['Banana', 'Orange'], ['Banana', 'Peach'], ['Orange', 'Peach']]

用户可以从这个列表中输入两个项目。

我想找到这两个项目组合在列表中的位置。

如果用户按照正确的顺序输入,比如“苹果 香蕉”,我可以找到位置,但如果顺序反过来输入“香蕉 苹果”,就找不到了,因为列表里没有["香蕉", "苹果"]这个组合。

我知道可以用排列组合的方式来处理输入,这样就能得到["香蕉", "苹果"]和正确的['苹果', '香蕉']。但我该怎么检查一个组合是否在另一个组合里,而不使用嵌套的循环呢?即使是这个小检查也需要12次循环。

这是嵌套循环的代码:

for pr in permutations([input1, input2], 2):
    for comb in combinations(items, 2):
        if ..........:
            dosomething

1 个回答

2

你不需要去构建所有的组合;你要找的是集合操作

items = set(["Apple","Banana","Orange","Peach"])
if {input1, input2} <= items:
    # valid subset

示例:

>>> items = set(["Apple","Banana","Orange","Peach"])
>>> {'Apple', 'Banana'} <= items
True
>>> {'Banana', 'Apple'} <= items
True
>>> {'Banana', 'Watermelon'} <= items
False

如果你想要组合的索引,那么你也可以用组合来创建集合

inputs = {input1, input2}
found = None
for i, combo in enumerate(combinations(items, 2)):
    if set(combo) == inputs:
        found = i
        break

或者,使用生成器表达式:

inputs = {input1, input2}
found = next((i for i, c in enumerate(combinations(items, 2))
                if set(c) == inputs), None)

示例:

>>> items = ["Apple","Banana","Orange","Peach"]
>>> inputs = {'Banana', 'Apple'}
>>> next((i for i, c in enumerate(combinations(items, 2)) if set(c) == inputs), None)
0

撰写回答