您可以map
一起使用itertools.product
:
list(map('-'.join, itertools.product('abcd', 'kjlm')))
# ['a-k', 'a-j', 'a-l', 'a-m', 'b-k', 'b-j', 'b-l', 'b-m', 'c-k', 'c-j', 'c-l', 'c-m', 'd-k', 'd-j', 'd-l', 'd-m']
测试的正确性和时间:
为基准,通常免责声明适用。
在测试条件下,上述(“product map
”)解决方案比“天真”列表理解更快(“naive
”),但对于小问题大小,边距很小。
大部分的加速似乎是由于避免列表理解。事实上,如果map
由列表理解(“product compr
”),那么product
仍鳞比天真的方法更好,但在小尺寸问题取代落后:
small (4x4)
results equal: True True
naive 0.002420 ms
product compr 0.003211 ms
product map 0.002146 ms
large (4x4x4x4x4x4)
results equal: True True
naive 0.836124 ms
product compr 0.681193 ms
product map 0.385240 ms
参考
import itertools
import timeit
lists = [[chr(97 + 4*i + j) for j in range(4)] for i in range(6)]
print('small (4x4)')
print('results equal:', [x+'-'+y for x in lists[0] for y in lists[1]]
==
list(map('-'.join, itertools.product(lists[0], lists[1]))), end=' ')
print(['-'.join(t) for t in itertools.product(lists[0], lists[1])]
==
list(map('-'.join, itertools.product(lists[0], lists[1]))))
print('{:16s} {:9.6f} ms'.format('naive', timeit.timeit(lambda: [x+'-'+y for x in lists[0] for y in lists[1]], number=1000)))
print('{:16s} {:9.6f} ms'.format('product compr', timeit.timeit(lambda: ['-'.join(t) for t in itertools.product(lists[0], lists[1])], number=1000)))
print('{:16s} {:9.6f} ms'.format('product map', timeit.timeit(lambda: list(map('-'.join, itertools.product(lists[0], lists[1]))), number=1000)))
print('large (4x4x4x4x4x4)')
print('results equal:', ['-'.join((u, v, w, x, y, z)) for u in lists[0] for v in lists[1] for w in lists[2] for x in lists[3] for y in lists[4] for z in lists[5]]
==
list(map('-'.join, itertools.product(*lists))), end=' ')
print(['-'.join(t) for t in itertools.product(*lists)]
==
list(map('-'.join, itertools.product(*lists))))
print('{:16s} {:9.6f} ms'.format('naive', timeit.timeit(lambda: ['-'.join((u, v, w, x, y, z)) for u in lists[0] for v in lists[1] for w in lists[2] for x in lists[3] for y in lists[4] for z in lists[5]], number=1000)))
print('{:16s} {:9.6f} ms'.format('product compr', timeit.timeit(lambda: ['-'.join(t) for t in itertools.product(*lists)], number=1000)))
print('{:16s} {:9.6f} ms'.format('product map', timeit.timeit(lambda: list(map('-'.join, itertools.product(*lists))), number=1000)))
你的嵌套for循环* * Pythonic。 –