У меня есть список с некоторыми элементами и вы хотите перебрать все возможные способы разделить этот список на два списка. Под этим я подразумеваю все комбинации, поэтому порядок не имеет значения (т.е. Элементы 1 и 3 могут быть в одном списке, а элемент 2 - в другом). В настоящее время я делаю это так, где facs
- мой первоначальный список:
patterns = []
for i in range(2**(len(facs)-1)):
pattern = []
for j in range((len(facs)-1)):
pattern.append(i//(2**j)%2)
patterns.append(pattern)
for pattern in patterns:
l1 = [facs[-1]]
l2 = []
for i in range(len(pattern)):
if pattern[i] == 1:
l1.append(facs[i])
else:
l2.append(facs[i])
Итак, я в основном создаю список длины 2^(len(facs)-1)
и заполняю его любой возможной комбинацией из них и нулями. Затем я накладываю каждый шаблон на facs
, за исключением последнего элемента facs
, который всегда находится в l1
, так как в противном случае я получал бы каждый результат дважды, поскольку я обрабатываю два списка одинаково, независимо от того, что списки l1
или l2
.
Есть ли более быстрый и элегантный (более короткий/более питонический) способ сделать это?