Я пытаюсь создать список кортежей, состоящий из всех вариантов набора чисел. Однако я хочу удалить из списка все варианты, которые представляют собой ту же последовательность, но смещены на одну или две позиции. Например: (-1,1,2), (1,2,-1) & (2,-1,1) Мне нужен только первый.

Вот где я до:

import itertools as it

list = [-1, 0, 1, 2]
cycles = []

list_cycle_3 = it.permutations(cycles, 3)
list_cycle_4 = it.permutations(cycles, 4)

for item in list_cycle_3:
    cycles.append(item)

for item in list_cycle_4:
    cycles.append(item)

print(cycles)

Это приводит к:

[(-1, 0, 1), (-1, 0, 2), (-1, 1, 0), (-1, 1, 2), (-1, 2, 0), (-1, 2, 1), 
(0, -1, 1), (0, -1, 2), (0, 1, -1), (0, 1, 2), (0, 2, -1), (0, 2, 1), 
(1, -1, 0), (1, -1, 2), (1, 0, -1), (1, 0, 2), (1, 2, -1), (1, 2, 0), 
(2, -1, 0), (2, -1, 1), (2, 0, -1), (2, 0, 1), (2, 1, -1), (2, 1, 0), 
(-1, 0, 1, 2), (-1, 0, 2, 1), (-1, 1, 0, 2), (-1, 1, 2, 0), (-1, 2, 0, 1), (-1, 2, 1, 0), (0, -1, 1, 2), (0, -1, 2, 1), (0, 1, -1, 2), (0, 1, 2, -1), 
(0, 2, -1, 1), (0, 2, 1, -1), (1, -1, 0, 2), (1, -1, 2, 0), (1, 0, -1, 2), 
(1, 0, 2, -1), (1, 2, -1, 0), (1, 2, 0, -1), (2, -1, 0, 1), (2, -1, 1, 0), 
(2, 0, -1, 1), (2, 0, 1, -1), (2, 1, -1, 0), (2, 1, 0, -1)]

Итак, что мне делать дальше, чтобы отфильтровать результаты, чтобы у меня были только те результаты, которые я хочу, а именно:

[(-1, 0, 1), (-1, 0, 2), (-1, 1, 0), (-1, 1, 2), (-1, 2, 0), (-1, 2, 1), 
(0, 1, 2), (0, 2, 1), (-1, 0, 1, 2), (-1, 0, 2, 1), (-1, 1, 0, 2), 
(-1, 1, 2, 0), (-1, 2, 0, 1), (-1, 2, 1, 0)]

Если это помогает, простая разница между списками состоит в том, что список, который я хочу, - это все кортежи, начинающиеся с -1, и кортежи, в которых нет -1, начинающиеся с 0

-1
user11655340 16 Июн 2019 в 18:55

2 ответа

Лучший ответ

Начните со списка, который не содержит число, по которому вы хотите фильтровать:

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

l = [-1, 1, 2]

Найдите все два элемента перестановок и отфильтруйте их, как вам нравится. Затем Ant добавляет 0 в качестве первого элемента, сопоставляя ваш набор результатов.

Примере:

In [2]: from itertools import permutations
In [3]: l = [-1, 1, 2]
In [4]: p = permutations(l, 2)
In [5]: [(0, *t) for t in p]
Out[5]: [(0, -1, 1), (0, -1, 2), (0, 1, -1), (0, 1, 2), (0, 2, -1), (0, 2, 1)]

Вы можете сделать аналогичный трюк, скажем, для тех, у кого нет -1, и начать с 0, который пропускает -1 и 0 в вашем списке, а затем добавить 0 в качестве первого элемента в элементы набора результатов.

И не переопределяйте зарезервированные ключевые слова в своем коде:

list =  [...] # do not do that
0
altunyurt 16 Июн 2019 в 16:31
    l=[(-1, 0, 1), (-1, 0, 2), (-1, 1, 0), (-1, 1, 2), (-1, 2, 0), (-1, 2, 1),                                                                                           
    (0, -1, 1), (0, -1, 2), (0, 1, -1), (0, 1, 2), (0, 2, -1), (0, 2, 1),
    (1, -1, 0), (1, -1, 2), (1, 0, -1), (1, 0, 2), (1, 2, -1), (1, 2, 0),
    (2, -1, 0), (2, -1, 1), (2, 0, -1), (2, 0, 1), (2, 1, -1), (2, 1, 0),
    (-1, 0, 1, 2), (-1, 0, 2, 1), (-1, 1, 0, 2), (-1, 1, 2, 0), (-1, 2, 0, 1), (-1, 2, 1, 0), (0, -1, 1, 2), (0, -1, 2, 1), (0, 1, -1, 2), (0, 1, 2, -1),
    (0, 2, -1, 1), (0, 2, 1, -1), (1, -1, 0, 2), (1, -1, 2, 0), (1, 0, -1, 2),
    (1, 0, 2, -1), (1, 2, -1, 0), (1, 2, 0, -1), (2, -1, 0, 1), (2, -1, 1, 0),
    (2, 0, -1, 1), (2, 0, 1, -1), (2, 1, -1, 0), (2, 1, 0, -1)]

   l2=[]

   for i in l:
       if i[0] == -1 :
           l2.append(i)

   print(l2)

Этот код работает

вывод

[(-1, 0, 1), (-1, 0, 2), (-1, 1, 0), (-1, 1, 2), (-1, 2, 0), (-1, 2, 1), (-1, 0, 1, 2), (-1, 0, 2, 1), (-1, 1, 0, 2), (-1, 1, 2, 0), (-1, 2, 0, 1), (-1, 2, 1, 0)]
0
its_vinayak 16 Июн 2019 в 16:09