Python находит подмножества списка списков, которые удовлетворяют определенному условию - PullRequest
0 голосов
/ 04 июля 2018

спасибо, что дали мне возможность задать вопрос здесь.

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

Сначала давайте создадим пример:

from itertools import permutations
perm3 = list(permutations([1,2,3,4],3))

Мы создаем все перестановки длины 3 из этих чисел (например, (1,2,3), (1,3,2), ...). Теперь я хотел бы найти все подмножества, которые удовлетворяют определенному условию. Например, найдите подмножество всех перестановок, у которых «3» никогда не стоит на первом месте. Одно это должно быть возможно довольно легко:

first_neq_3 = [tuple for tuple in perm3 if tuple[0]!= 3]

Но, очевидно, это дает мне только одно подмножество, а именно - "самое большое". Теперь я хотел бы найти ВСЕ подмножества, которые удовлетворяют этому условию. Короткий пример, скажем, first_neq_3 = [(1,2,3), (2,1,3), (1,3,2), (2,3,1)] - тогда я бы тоже хотел найти [ (1,2,3), (2,1,3)] и т. Д.
Признаюсь, это довольно простая проблема для предоставленного примера, но я застрял, и это усложняется при более сложных условиях.

1 Ответ

0 голосов
/ 04 июля 2018

Если я правильно понимаю, вам нужны все подмножества списка first_neq_3 выше (всех возможных длин). Тогда вы можете получить их, используя код ниже

from itertools import combinations
sum(map(lambda r: list(combinations(first_neq_3, r)), range(1, len(first_neq_3)+1)), [])

ПОЯСНЕНИЯ

Ключ здесь - функция map. itertools.combinations дает вам все подмножества list заданной длины. Поскольку нам нужны подмножества всех длин, мы выполняем это действие, используя r в качестве фиктивной переменной, работающей на всех возможных длинах. Поскольку первый аргумент map должен быть функцией, удобно использовать выражение lambda.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...