>>> big = [[1, '34', '44'], [1, '40', '30', '41'], [1, '41', '40', '42'], [1, '42', '41', '43'], [1, '43', '42', '44'], [1, '44', '34', '43']]
>>> set(reduce ( lambda l,a : l + a, big))
set([1, '44', '30', '42', '43', '40', '41', '34'])
如果你真的想要一份最终结果的清单
>>>>[list(set(reduce ( lambda l,a : l + a, big)))]
[[1, '44', '30', '42', '43', '40', '41', '34']]
如果你不喜欢为列表添加重新编码 lambda 函数:
>>>>[list(set(reduce ( list.__add__, big)))]
[[1, '44', '30', '42', '43', '40', '41', '34']]
编辑 :在您建议使用 itertools.chain 而不是 list.__add__ 之后,我使用原始海报使用的原始变量对两者运行了 timeit。
看来 timeit 乘以 list.__add__ 大约需要 2.8 秒,而 itertools.chain 乘以大约 3.5 秒。
我检查了这个页面,是的,你是对的,itertools.chain 包含一个 from_iterable 方法,它可以大大提高性能。请参见下面的 list.__add__、itertools.chain 和 itertools.chain.from_iterable。
>>> timeit.timeit("[list(set(reduce ( list.__add__, big)))]", setup="big = [ [10,20,30,40] for ele in range(10000)]", number=30)
16.051744650801993
>>> timeit.timeit("[list(set(reduce ( itertools.chain, big)))]", setup="big = [ [10,20,30,40] for ele in range(10000)]", number=30)
54.721315866467194
>>> timeit.timeit("list(set(itertools.chain.from_iterable(big)))", setup="big = [ [10,20,30,40] for ele in range(10000)]", number=30)
0.040056066849501804
非常感谢您的建议:)