>>> 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
非常感谢您的建议 :)