Как добавить каждый элемент из списка в список в списке в Python? - PullRequest
0 голосов
/ 01 декабря 2018

Извините за загадочное название.Например, у меня есть список: [a, b, c, d]

Я хочу создать ранжированный список с различными комбинациями в этом формате:

[a]
[b]
[c]
[d]
[a, b]
[a, c]
[a, d]
[a, b, c]
[a, b, d]
[a, b, c, d]

У меня возникли проблемы при создании этого списка.Пока что я сначала сгенерировал каждый список, добавив элемент на итерацию:

[]
[a]
[a, b]
[a, b, c]

Затем я сгенерировал длину того, как должен выглядеть ранжированный список:

[]
[]
[]
[]
[a]
[a]
[a]
[a, b]
[a, b]
[a, b, c]

ТеперьЯ застрял отсюда.Есть ли в Python библиотека, которая позволяет мне это делать, или вы можете делать это только вручную в коде?Последнее, что мне нужно сделать, - это сделать список один-к-одному, добавляя его к исходному списку, который я сгенерировал вверху.

Вот код того, что я пытался сделать, предположим, original_list - этоисходный список, который я сделал вверху, и new_list - это список, который я создал прямо над этим текстом:

for x in range(0, len(original_list)):
    new_list[x].append(original_list[x])

Очевидно, это не работает, так как он добавляет каждый элемент от original_list к первому4 элемента в new_list.

РЕДАКТИРОВАТЬ: элементы должны быть в алфавитном порядке, только последний элемент имеет разные комбинации без повторяющихся элементов, так как я пытаюсь это сделать в списке из 21 элемента.

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Попробуйте:

from itertools import combinations

a = ['a', 'b', 'c', 'd']
result = [list(combinations(a,i))for i in range(1,len(a)+1)]

и для печати вот так:

for i in result:
    print(*list(i), sep='\n')
0 голосов
/ 01 декабря 2018

Используйте простую итерацию по списку, добавляя его в новый список:

lst = ['a', 'b', 'c', 'd', 'e']

nlst = []
for i in range(len(lst)):
    for y in lst[i:]:
        nlst.append(lst[:i] + list(y))

for x in nlst:
    print(x)

# ['a']
# ['b']
# ['c']
# ['d']
# ['e']
# ['a', 'b']
# ['a', 'c']
# ['a', 'd']
# ['a', 'e']
# ['a', 'b', 'c']
# ['a', 'b', 'd']
# ['a', 'b', 'e']
# ['a', 'b', 'c', 'd']
# ['a', 'b', 'c', 'e']
# ['a', 'b', 'c', 'd', 'e']
0 голосов
/ 01 декабря 2018

Используя рецепт powerset из рецептов itertools , вы можете сделать:

from itertools import chain, combinations


def powerset(iterable):
    s = list(iterable)
    it = chain.from_iterable(combinations(s, r) for r in range(len(s) + 1))
    return map(list, (e for e in it if e))


result = sorted(powerset(['a', 'b', 'c', 'd']), key=lambda x: (len(x), ''.join(x)))
for s in result:
    print(s)

Вывод

['a']
['b']
['c']
['d']
['a', 'b']
['a', 'c']
['a', 'd']
['b', 'c']
['b', 'd']
['c', 'd']
['a', 'b', 'c']
['a', 'b', 'd']
['a', 'c', 'd']
['b', 'c', 'd']
['a', 'b', 'c', 'd']

ОБНОВЛЕНИЕ

Учитывая обновленные требования, вы можете сделать:

lst = ['a', 'b', 'c', 'd']
length = len(lst)


def patterns(l):
    for i in range(length):
        for c in l[i:]:
            yield l[:i] + [c]


for pattern in sorted(patterns(lst), key=lambda x: (len(x), ''.join(x))):
    print(pattern)

Вывод

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