2014-06-15 56 views
1

比较我大名单的所有可能的组合排列与组合

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']] 

而且用户可以输入从该列表中的两个项目,

我想在列表中获得所述组合的索引。

我可以这样做,如果用户输入正确的顺序,如“苹果香蕉”,但不是如果它是相反的“香蕉苹果”。因为没有[“香蕉”,“苹果”]

我知道我可以在输入中使用排列,因此它同时给出[“香蕉”,“苹果”]和正确的['苹果'''香蕉' ]。但是,如何在不使用嵌套for循环的情况下检查一个是否在另一个中呢?即使这个小检查导致12次迭代。

这里的鸟巢循环:

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

如何使用'set'存储组合? –

+0

Martijn得到了正确的答案。 –

回答

2

你并不需要建立所有组合;你正在寻找的是set operations

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 
+0

那么,即使我不知道这件事,这不是我正在寻找的,我需要得到组合的索引。 –