пусть if / else прерывается из одного цикла в понимании списка, который зацикливается на два диапазона - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть понимание списка с помощью оператора if else, который зацикливается на два диапазона.

Возможно ли, используя списки, вырваться из одного из двух циклов, когда условие if проверяет false?

В моем примере кода я хочу упорядоченный список со всеми уникальными комбинациями (с указанной максимальной длиной) данной буквы в порядке алфавита «мой».

str_len = 3
my_list = ["A", "H"]
alphabet = [" ", "A", "H"]
for i in range(str_len-1):
    my_list = [i+j if i[-1] != " " else i for i in my_list for j in alphabet]
print(my_list)

Вот чтоЯ получаю.

['A', 'A', 'A', 'AA', 'AAA', 'AAH', 'AH', 'AHA', 'AHH', 'H ',' H ',' H ',' HA ',' HAA ',' HAH ',' HH ',' HHA ',' HHH ']

Однако я не хочу дубликатов. как это:

['A', 'AA', 'AAA', 'AAH', 'AH', 'AHA', 'AHH', 'H', 'HA', 'HAA ',' HAH ',' HH ',' HHA ',' HHH ']

Редактировать: указано Я хочу упорядоченный список.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Посмотрите на itertools.combination :

itertools.combinations(iterable, r)

Возвращает подпоследовательности элементов r длины из входного итерируемого.

Комбинации генерируются влексикографический порядок сортировки. Таким образом, если входной итерируемый объект отсортирован, наборы комбинаций будут создаваться в отсортированном порядке.

С помощью itertools.combinations вы можете определить только статическую длину комбинаций, но затем вы можете комбинировать ее с chain.from_iterable

from itertools import chain, combinations
str_min_len = 1
str_max_len = 3
my_list = ["A", "H"]
result = chain.from_iterable(
   combinations(my_list, i) for i in range(str_min_len, str_max_len))

Надеюсь, это поможет.

0 голосов
/ 10 ноября 2019

Вы можете использовать метод set () для предотвращения дублирования в любом создаваемом вами списке.

это сделает работу:

print(set(my_list))
...