在itertools.product中使用lambda以获得更好的代码

时间:2015-08-14 20:55:27

标签: python lambda

为了帮助我更好地理解和编写更紧凑的代码,我怀疑以下内容可以使用lambda加入两个perms =赋值中。任何python大师?

import itertools

l = [["a", "b"], ["c", "d", "e"]]
perms = list(itertools.product(*l))
perms = sorted([",".join(x) for x in perms])
print perms

我怀疑可以在同一个lambda中完成的辅助,如果l是整数列表的列表,因为以下完全失败?

import itertools

l = [[1, 2], [3, 4, 5]]
perms = list(itertools.product(*l))
perms = sorted([",".join(x) for x in perms])
print perms

2 个答案:

答案 0 :(得分:3)

你不需要任何lambdas。只需直接在itertools.product()生成器上循环,而不先将其转换为列表:

perms = sorted([",".join(x) for x in itertools.product(*l)])

[..]括号可以省略,因为sorted()会将生成器表达式转换为列表无论如何,但生成列表对象的速度要快一些。

请注意,您的product()输出已按照您提供的特定输入的排序顺序排列,因此sorted()在这里是多余的。

演示:

>>> from itertools import product
>>> l = [["a", "b"], ["c", "d", "e"]]
>>> sorted([",".join(x) for x in product(*l)])
['a,c', 'a,d', 'a,e', 'b,c', 'b,d', 'b,e']
>>> [",".join(x) for x in product(*l)]
['a,c', 'a,d', 'a,e', 'b,c', 'b,d', 'b,e']

您的第二次尝试失败是因为您需要将整数映射到字符串,然后才能对这些字符串使用str.join()

l = [[1, 2], [3, 4, 5]]
perms = sorted([",".join(map(str, x)) for x in itertools.product(*l)])

或更好的是,只需将输入转换为字符串

perms = sorted([",".join(x) for x in itertools.product(*(map(str, li) for li in l))])

答案 1 :(得分:3)

你可以写:

import itertools

l = [["a", "b"], ["c", "d", "e"]]
perms = sorted(",".join(x) for x in itertools.product(*l))
print perms

这将迭代值而没有不必要的列表。