为了帮助我更好地理解和编写更紧凑的代码,我怀疑以下内容可以使用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
答案 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
这将迭代值而没有不必要的列表。