Featured image of post Python 利用匿名函数和 reduce() 方法对嵌套列表去重

Python 利用匿名函数和 reduce() 方法对嵌套列表去重

示例及结果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
from functools import reduce

# 待去重嵌套列表(元素为字典)
aa = [{'bigAsset1': '资产1', 'bigAsset2': '资产2'}, {'bigAsset1': '资产2', 'bigAsset2': '资产1'}, {'bigAsset1': '资产3', 'bigAsset2': '资产1'}, {'bigAsset1': '资产1', 'bigAsset2': '资产2'}, {'bigAsset1': '资产2', 'bigAsset2': '资产3'}]

# 待去重嵌套列表(元素为集合)
bb = [{'资产1', '资产2'}, {'资产2', '资产1'}, {'资产3', '资产1'}, {'资产1', '资产2'}, {'资产2', '资产3'}]

cc = [['资产1', '资产2'], ['资产2', '资产1'], ['资产3', '资产1'], ['资产1', '资产2'], ['资产2', '资产3']]

run_function = lambda x,y : x if y in x else x + [y]

aa = reduce(run_function, [[],] + aa)
bb = reduce(run_function, [[],] + bb)
cc = reduce(run_function, [[],] + cc)

print(aa)
# [{'bigAsset1': '资产1', 'bigAsset2': '资产2'}, {'bigAsset1': '资产2', 'bigAsset2': '资产1'}, {'bigAsset1': '资产3', 'bigAsset2': '资产1'}, {'bigAsset1': '资产2', 'bigAsset2': '资产3'}]
print(bb)
# [{'资产1', '资产2'}, {'资产3', '资产1'}, {'资产3', '资产2'}]
print(cc)
# [['资产1', '资产2'], ['资产2', '资产1'], ['资产3', '资产1'], ['资产2', '资产3']]

 注意上面不同的两种结果,适用于不同场景。对于上例中若对资产顺序无要求,去重应采用bb的形式。

原理分析

 打开你的IDE调试思路会很清晰,打开之前你可能需要了解这些知识:

 匿名函数run_function这行的功能实现等同于以下方法:

1
2
3
4
5
def run_function(x, y):
    if y in x:
        return x
    else:
        return x + [y]

 其次,注意两个列表相加的结果,例如:

1
2
[[],] + bb
# [[], {'资产1', '资产2'}, {'资产1', '资产2'}, {'资产3', '资产1'}, {'资产1', '资产2'}, {'资产3', '资产2'}]
Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计