Python: набор фильтров/список кортежей на основе свойства мощностиPython

Программы на Python
Anonymous
Python: набор фильтров/список кортежей на основе свойства мощности

Сообщение Anonymous »

Я ищу способ фильтровать набор (или список) кортежей на основе того, сколько раз тот
элемент появляется в одной или другой позиции кортежа.Моя текущая цель немного сложна, поэтому я разделил проблему на три более мелких этапа.
1. Начнем с самого простого случая: только одно значение, которое применяется только к первому элементу кортежа.
Например:

Код: Выделить всё

my_filter([(1,2),(1,3),(2,4),(3,1),(3,4),(3,5),(5,2),(5,4)], 2)
Должен вернуться:

Код: Выделить всё

[(1,2),(1,3),(5,2),(5,4)]
Поскольку это единственные кортежи, для которых первый элемент кортежа связан, появляется во всем списке только дважды.
Наивный способ это делается так: для каждого первого элемента кортежа в списке подсчитайте, сколько раз этот элемент появляется в качестве первого элемента во всех кортежах, и, если счетчик соответствует выбранному числу, добавьте все кортежи, имеющие этот элемент в первой позиции.
Но мне кажется, что это настолько неоптимально, и мне приходится перебирать список для каждого возможного значения, что я наверняка упускаю лучший способ сделать это.
2. Сделайте это взаимным
В идеале хотелось бы иметь возможность применять ту же обработку на основе второго элемента кортежа, но с другим параметром мощности
Например:

Код: Выделить всё

my_filter([(1,2),(1,3),(2,4),(3,1),(3,4),(3,5),(5,2),(5,4)], 2, 1)
Здесь мы хотим сохранить только кортежи, в которых первый элемент появляется ровно дважды, а второй элемент появляется только один раз (пересечение двух условий). Это должно вернуться:

Код: Выделить всё

[(1,3)]
3. Обобщение нескольких значений

Код: Выделить всё

my_filter([(1,2),(1,3),(2,4),(3,1),(3,4),(3,5),(5,2),(5,4)], 2, [1,3])
В этом случае мы разрешаем фильтру мощности принимать несколько возможных значений. В этом примере мы хотим сохранить кортежи, для которых первый элемент появляется ровно два раза (в первой позиции), а второй элемент появляется один или три раза (во второй позиции). Это должно вернуться:

Код: Выделить всё

[(1,3),(5,4)]
Ещё раз: у меня нет проблем с написанием простого решения, которое просто перебирает все разрешенные значения и объединяет наборы результатов, но я ищу что-то более умное.
Мне кажется, что в библиотеке itertools могут быть некоторые полезные функции, но она меня не устраивает. Любой совет ? Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/788 ... y-property

Вернуться в «Python»