0

我有一个带有 if else 语句的列表理解,该语句在两个范围内循环。

当 if 条件测试为假时,是否有可能使用列表推导来打破两个循环之一?

在我的代码示例中,我想要一个有序列表,其中包含给定字母的所有唯一组合(具有指定的最大长度),按“我的”字母顺序排列。

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','哈哈','哈哈','哈哈','HH','HHA','HHH']

但是我不想重复。像这样:

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

编辑:指定我想要一个有序列表。

4

2 回答 2

0

您可以使用 set() 方法来防止在您创建的任何列表中重复。

这将完成这项工作:

print(set(my_list))
于 2019-11-10T12:14:15.667 回答
0

看看itertools.combinations

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))

希望能帮助到你。

于 2019-11-10T12:38:09.633 回答