2013-11-29 1 views
0

Относительный питон/программирование новичок здесь. Я использую метод перестановок itertools, чтобы сузить полученные результаты с помощью инструкции «if», чтобы создать список, который мне нужен.Python - сужение результатов перестановки itertools с помощью операторов "if". Как с повторным элементом?

В моем коде ниже вы увидите, что я хочу вернуть суженный список из перестановок, в которых индексы запятых соответствуют индексам запятых перестановочного списка. Однако этот код работает только в том случае, если я вручную помещаю индексы в оператор «if». Поскольку я не буду знать заранее, сколько запятых будет в списке, я хочу перестановочить, как мне это кодировать?

from itertools import permutations 

prp1 = ["UP", ",", "DOWN", "LEFT", ",", "RIGHT"] 

# grab indices for commas in 'prp1' list 
comma_indices = [] 
for index, p in enumerate(prp1): 
    if p == ",": 
     commas.append(index) 

perms = permutations(prp1) 
lst = [] 
for perm in perms: 
    # Presently I have manually inserted the indices of commas, 
    # but how to do this non-manual for unknown amount of commas here? 
    if perm[1] == ',' and perm[4] == ',': 
     lst.append(perm) 

for l in lst: 
    print l 

Я думаю о делать что-то вроде этого:

for perm in perms: 
    for comma in commas: 
     if........... 

..но тогда я только доступ к 1 запятая в то время.

Любая помощь очень ценится, Даррен

EDIT:

Некоторые больше примеров списков, которые должны быть перестановкой:

prp2 = ['down', ',', 'up', 'left', 'down'] 
prp3 = ['down', 'down', ',', 'up', ',', 'left', ',', 'right', ',', 'left'] 

ответ

1

Вы уже знаете, как найти индексы, где запятые расположенных без жесткого кодирования:

comma_indices = [] 
for index, p in enumerate(prp1): 
    if p == ",": 
     commas.append(index) 

Таким образом, вы можете применить тот же подход к perm и посмотреть, соответствует ли он, например.

observed_comma_indices = [index for index, p in enumerate(perm) if p == ","] 
if comma_indices == observed_comma_indices: 
    lst.append(perm) 

Но есть и другие подходы. Например, вместо того, генерируя все перестановки, а затем держать только те, которые вы хотите, вы можете создать только те, которые вы хотите в первую очередь:

from itertools import permutations 

def permute_some(seq, indices_to_permute): 
    for perm in permutations(indices_to_permute): 
     newseq = seq[:] 
     for i, p in zip(indices_to_permute, perm): 
      newseq[i] = seq[p] 
     yield newseq 

, который дает

>>> seq = ["A", "B", ",", "C", ","] 
>>> perm_ii = [i for i,x in enumerate(seq) if x != ","] 
>>> for p in permute_some(seq, perm_ii): 
...  print p 
...  
['A', 'B', ',', 'C', ','] 
['A', 'C', ',', 'B', ','] 
['B', 'A', ',', 'C', ','] 
['B', 'C', ',', 'A', ','] 
['C', 'A', ',', 'B', ','] 
['C', 'B', ',', 'A', ','] 
+0

Благодарим Вас за отличный ответ :-) Создание только перестановок, которые я хотел в первую очередь, было в глубине моего сознания, но я даже не знал, как начать приближаться к этому! –