Как включить условие подсчета в понимание списка? - PullRequest
2 голосов
/ 28 марта 2019

Я создал следующее:

from itertools import product
x = [(b0, b1, b2, b3) for b0, b1, b2, b3 in product(range(5), repeat=4)]

При этом создаются все кортежи от [0,0,0,0] до [4,4,4,4].

Я бы хотел включить в качестве условия только те кортежи, которые не имеют одинаковое число, повторенное более 2 раз. Поэтому я хотел бы игнорировать такие кортежи, как [2,2,2,1] или [3,3,3,3], сохраняя такие кортежи, как [0,0,1,2] или [1,3,4,2]

Я попробовал следующее, и я думаю, что это нормально, но это кажется довольно громоздким.

y = [(b0, b1, b2, b3) for b0, b1, b2, b3 in product(range(5), repeat=4) if (b0, b1, b2, b3).count(0)<=2 and (b0, b1, b2, b3).count(1)<=2 and (b0, b1, b2, b3).count(2)<=2 and (b0, b1, b2, b3).count(3)<=2  and (b0, b1, b2, b3).count(4)<=2]

Возможно, способ подсчитать каждый из элементов из [0,1,2,3,4] и взять их максимум и заявить, что максимум <= 2. </p>

Как можно включить в понимание списка условие подсчета?

Ответы [ 2 ]

4 голосов
/ 29 марта 2019

Использование set может работать.Другой вариант - использовать collections.Counter:

from collections import Counter
from itertools import product
x =  [
     comb for comb in product(range(5), repeat=4)
     if max(Counter(comb).values()) <= 2
     ]
2 голосов
/ 29 марта 2019

Вы можете создать генератор для создания ваших кортежей и проверить свое состояние с помощью Counter:

from itertools import product
from collections import Counter

def selected_tuples():
    for t in product(range(5), repeat=4):
        if Counter(t).most_common(1)[0][1]<=2:
            yield t

print(list(selected_tuples()))

Выход:

[(0, 0, 1, 1), (0, 0, 1, 2), (0, 0, 1, 3), (0, 0, 1, 4), ...]
...