2014-06-15 2 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']] 

И пользователь может ввести два пункта из этого списка,

Я хочу получите Индекс указанной комбинации в списке.

Я могу это сделать Если пользователь вводит правильный порядок, например, «Apple Banana», но нет, если это противоположное «Банановое яблоко». Потому что нет [«Банан», «Яблоко»]

Я знаю, что могу использовать перестановки во вводе, поэтому он дает как [«Банан», «Яблоко»], так и правильный [«Яблоко», «Банана», ]. Но как проверить, находится ли кто-то в другом, не используя вложенные петли? Даже эта небольшая проверка приводит к 12 итерациям.

Вот петля гнездо:

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

Как об использовании 'set' для хранения комбинаций? –

+0

У Мартайна есть правильный ответ. –

ответ

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

Ну, даже я не знал об этом, это не то, что я искал, мне нужно получить Индекс этой комбинации. –

Смежные вопросы