Сортировка вложенных списков
В результате работы програмы с вводом [1,2,"a"] получаю список [[], [1], [2], [1, 2], ['a'], [1, 'a'], [2, 'a'], [1, 2, 'a']].
def get_combination(my_list):
comb_list=[]
n=len(my_list)
for i in range(2**n):
c = []
for j in range(n):
if i == 0: break
if i & 1: c.append(my_list[j])
i >>= 1
comb_list.append(c)
Мне нужно как-то отсортировать его и получить [[], [1], [2], ['a'], [1, 2], [1, 'a'], [2, 'a'], [1, 2, 'a']]. Вроде бы поменять местами два елемента, но это не сработает на список другой длины поэтому только сортировка. Вот с ней и начинаются проблемы. Еще один пример того что должно быть : вход
[1,2,3,4] = [[],
[1], [2], [3], [4],
[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4],
[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4],
[1, 2, 3, 4]]
И то что есть : [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3], [4], [1, 4], [2, 4], [1, 2, 4], [3, 4], [1, 3, 4], [2, 3, 4], [1, 2, 3, 4]] Может быть нужно изменить саму функцию.
Ответы (2 шт):
Вот так:
from itertools import *
sp=[1,2,3,4]
for j in range(len (sp)+1):
for i in combinations(sp, j):
print(list(i))
Результат:
[]
[1]
[2]
[3]
[4]
[1, 2]
[1, 3]
[1, 4]
[2, 3]
[2, 4]
[3, 4]
[1, 2, 3]
[1, 2, 4]
[1, 3, 4]
[2, 3, 4]
[1, 2, 3, 4]
При:
sp=[1,2,"a"]
получаем
[]
[1]
[2]
['a']
[1, 2]
[1, 'a']
[2, 'a']
[1, 2, 'a']
А если вдруг внезапно выясниться, что использовать библиотеки запрещено - по использовать скрипт, реализующий функцию combinations:
https://docs.python.org/3/library/itertools.html#itertools.combinations
def combinations(iterable, r):
# combinations('ABCD', 2) --> AB AC AD BC BD CD
# combinations(range(4), 3) --> 012 013 023 123
pool = tuple(iterable)
n = len(pool)
if r > n:
return
indices = list(range(r))
yield tuple(pool[i] for i in indices)
while True:
for i in reversed(range(r)):
if indices[i] != i + n - r:
break
else:
return
indices[i] += 1
for j in range(i+1, r):
indices[j] = indices[j-1] + 1
yield tuple(pool[i] for i in indices)
Вот так можно:
def main():
tests = [
[1, 2, 'a'],
[1, 2, 3, 4],
]
for test in tests:
combs = get_combinations(test)
print(combs)
def get_combinations(iterable):
res = [[]]*(2**(len(iterable)))
k = 0
for j in range(len(iterable)+1):
for comb in combinations(iterable, j):
res[k] = comb
k += 1
return res
def combinations(iterable, r):
res = []
pool = tuple(iterable)
n = len(pool)
if r > n:
return
indices = list(range(r))
res.append([pool[i] for i in indices])
while True:
for i in reversed(range(r)):
if indices[i] != i + n - r:
break
else:
return res
indices[i] += 1
for j in range(i+1, r):
indices[j] = indices[j-1] + 1
res.append([pool[i] for i in indices])
return res
main()