Создание списков, где каждый элемент имеет длину я - PullRequest
1 голос
/ 20 апреля 2020

Я пытаюсь составить списки, в которых каждый элемент находится в списке i, но с моим текущим кодом ниже я получаю плохой результат.

from itertools import combinations
x = 'ABCDABC'
y = [''.join(l) for i in range(len(x)) for l in combinations(x, i+1)]
z = []
for i in y:
    if i in x:
        z.append(i)

w = sorted(list(set(z)))

def Sorting(lst):
    lst.sort(key=len)
    return lst

final = 0

for i in range(len(z)):
    c = []
    for j in z:
        if len(j) == i:
            c.append(j)
    print(c)

результат:

[]
['A', 'B', 'C', 'D', 'A', 'B', 'C']
['AB', 'AB', 'BC', 'BC', 'CD', 'DA', 'AB', 'BC']
['ABC', 'ABC', 'ABC', 'BCD', 'CDA', 'DAB', 'ABC']
['ABCD', 'BCDA', 'CDAB', 'DABC']
['ABCDA', 'BCDAB', 'CDABC']
['ABCDAB', 'BCDABC']
['ABCDABC']
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]

где это должно быть просто:

['A', 'B', 'C', 'D', 'A', 'B', 'C']
['AB', 'AB', 'BC', 'BC', 'CD', 'DA', 'AB', 'BC']
['ABC', 'ABC', 'ABC', 'BCD', 'CDA', 'DAB', 'ABC']
['ABCD', 'BCDA', 'CDAB', 'DABC']
['ABCDA', 'BCDAB', 'CDABC']
['ABCDAB', 'BCDABC']
['ABCDABC']

, чтобы я мог дальше манипулировать

1 Ответ

0 голосов
/ 20 апреля 2020

для использования только вашего кода:

max_len = max(map(len, z))
for i in range(1, max_len + 1):
    c = []
    for j in z:
        if len(j) == i:
            c.append(j)
    print(c)

вывод:

['A', 'B', 'C', 'D', 'A', 'B', 'C']
['AB', 'AB', 'BC', 'BC', 'CD', 'DA', 'AB', 'BC']
['ABC', 'ABC', 'ABC', 'BCD', 'CDA', 'DAB', 'ABC']
['ABCD', 'BCDA', 'CDAB', 'DABC']
['ABCDA', 'BCDAB', 'CDABC']
['ABCDAB', 'BCDABC']
['ABCDABC']

для получения ожидаемого результата вы можете использовать collections.defaultdict:

from collections import defaultdict

d = defaultdict(list)
for s in z:
    d[len(s)].append(s)
c = list(d.values())
c

output:

[['A', 'B', 'C', 'D', 'A', 'B', 'C'],
 ['AB', 'AB', 'BC', 'BC', 'CD', 'DA', 'AB', 'BC'],
 ['ABC', 'ABC', 'ABC', 'BCD', 'CDA', 'DAB', 'ABC'],
 ['ABCD', 'BCDA', 'CDAB', 'DABC'],
 ['ABCDA', 'BCDAB', 'CDABC'],
 ['ABCDAB', 'BCDABC'],
 ['ABCDABC']]

вы создаете словарь, где ключ - это длина вашей текущей строки, а каждое значение - это список со всеми строками одинаковой длины, чтобы получить ожидаемый результат, который вы получают только значения dict

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