传智播客旗下技术交流社区北京校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小江哥 黑马粉丝团   /  2019-5-13 14:38  /  64 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

之前做数据的时候碰到一个需求,需要把两个或者多个列表里的元素做排列组合.
例如:
[Python] 纯文本查看 复制代码
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,瞬间就开窍了,草草吃完饭然后花了几分钟写出了这个需求,现在放在这里与诸君共勉.
[Python] 纯文本查看 复制代码
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~
分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马