之前做数据的时候碰到一个需求,需要把两个或者多个列表里的元素做排列组合.
例如:
list1 = [1, 2]
list2 = [3, 4]
list3 = [5, 6]
def fn(lists):
# 省略处理过程
...
res = fn([list1, list2, list3])
print(res)
# 最终结果为:
['1,3,5', '1,3,6', '1,4,5', '1,4,6', '2,3,5', '2,3,6', '2,4,5', '2,4,6']
当时很头疼,这个听起来很简单的需求让我苦恼了一上午,吃中午饭时我突然灵机一动想起了python里的高阶函数之reduce,瞬间就开窍了,草草吃完饭然后花了几分钟写出了这个需求,现在放在这里与诸君共勉.
def lists_combination(lists, code=''):
'''输入多个列表组成的列表, 输出其中每个列表所有元素可能的所有排列组合
code用于分隔每个元素'''
try:
import reduce
except:
from functools import reduce
def myfunc(list1, list2):
return [str(i)+code+str(j) for i in list1 for j in list2]
return reduce(myfunc, lists)
至此,完美解决了这个需求,诸君有类似的需求都可以拿走些微修改一下满足自己的需求.
你以为这就完了?
当然没完,基于程序员精益求精的精神,(能写一行绝不写两行),吃完晚饭没事干的我,把他压缩成了一行!
嘿嘿嘿~
fn = lambda x, code=',': reduce(lambda x, y: [str(i)+code+str(j) for i in x for j in y], x)
# 直接调用fn(lists, code)
end~