- 此问题在此处已有答案**:
Avoiding nested for loops(3个答案)
9小时前关门了。
我想创建一个使用三个大写字母的所有组合的恒等式集,同时避免for
循环以节省计算时间。我想拥有从ID_AAA
到ID_ZZZ
的恒等式。
我可以使用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))
这是在所有字母之间同时迭代,所以我只能得到ID_AAA
,ID_BBB
,...,ID_ZZZ
。所有三个字母总是相同的结果。我可以微调这种方法,以便一次迭代一个字母,还是需要使用完全不同的方法?
3条答案
按热度按时间sr4lhrrt1#
您只是重新实现了
itertools.product
。或
这取决于您对从
product
产生的三重奏构造字符串的偏好。mlmc2os52#
“我可以微调这种方法,以便每次迭代一个字母,还是我需要使用一种完全不同的方法?”是的...这将是3个独立的循环。无论你使用
map
,循环或解析,在这种情况下,它是语法糖,你必须通过在这种情况下的所有可能性,没有捷径imho.您可以使用例如
itertools
中的product
来使其更具可读性:ecfsfe2w3#
您实际上是在这样做:
它也被称为Cartesian Product。
你也可以直接使用itertools中的product:
不要忘记,重构代码是“更好的”,这样在不必要的情况下就不会生成整个列表。
您可以执行以下操作:
或者这个:
一次产生一个。
(From注解,你也可以做这个生成器:
这很酷...)