Python中避免for循环构造三位大写字母组合的ID字符串
生成ID_AAA到ID_ZZZ的三位大写字母组合(避免for循环)
要生成从ID_AAA到ID_ZZZ的所有三位大写字母组合,想避开嵌套for循环来提升效率。已经用嵌套for循环实现了需求,但用map函数时只得到三个字母相同的结果(比如ID_AAA、ID_BBB这类),想知道能不能调整map的用法,或者有没有其他更合适的方案。
已实现的嵌套for循环代码
from string import ascii_uppercase IDs = [] for id_first_letter in ascii_uppercase: for id_second_letter in ascii_uppercase: for id_third_letter in ascii_uppercase: IDs.append('ID_' + id_first_letter + id_second_letter + id_third_letter)
尝试的map函数代码(结果不符合预期)
from string import ascii_uppercase IDs = list(map(lambda x,y,z: 'ID_' + x + y + z,ascii_uppercase,ascii_uppercase,ascii_uppercase))
问题原因&解决方案
为什么map的结果不对?
map函数是按位置一一对应取三个可迭代对象的元素:第一个元素取ascii_uppercase[0](即'A')三次,生成ID_AAA;第二个元素取ascii_uppercase[1](即'B')三次,生成ID_BBB……以此类推,所以只会得到三个字母完全相同的组合,而不是所有可能的三位字母笛卡尔积。
最优方案:用itertools.product
itertools.product专门用来生成多个可迭代对象的笛卡尔积,底层由C实现,效率比嵌套for循环更高,代码也更简洁:
from string import ascii_uppercase from itertools import product # 列表推导式写法(直观易读) IDs = [f'ID_{a}{b}{c}' for a, b, c in product(ascii_uppercase, repeat=3)] # 如果一定要用map的写法 IDs = list(map(lambda chars: f'ID_{chars[0]}{chars[1]}{chars[2]}', product(ascii_uppercase, repeat=3)))
product(ascii_uppercase, repeat=3)等价于把ascii_uppercase重复三次做嵌套循环,会生成所有三位大写字母的组合,再拼接成ID_XXX的格式即可。
内容的提问来源于stack exchange,提问作者BrunoCAfonso
相关产品推荐
相关产品推荐

