【发布时间】:2016-06-22 07:42:30
【问题描述】:
有一个 C++ 比较可以从列表列表中获取列表的联合:The fastest way to find union of sets
还有其他几个与 python 相关的问题,但没有一个建议以最快的方式合并列表:
从答案中,我收集到至少有两种方法可以做到这一点:
>>> from itertools import chain
>>> x = [[1,2,3], [3,4,5], [1,7,8]]
>>> list(set().union(*x))
[1, 2, 3, 4, 5, 7, 8]
>>> list(set(chain(*x)))
[1, 2, 3, 4, 5, 7, 8]
请注意,我稍后会将集合转换为列表,因为我需要修复列表的顺序以进行进一步处理。
经过一番比较,list(set(chain(*x))) 似乎更稳定,耗时更少:
from itertools import chain
import time
import random
# Dry run.
x = [[random.choice(range(10000))
for i in range(10)] for j in range(10)]
list(set().union(*x))
list(set(chain(*x)))
y_time = 0
z_time = 0
for _ in range(1000):
x = [[random.choice(range(10000))
for i in range(10)] for j in range(10)]
start = time.time()
y = list(set().union(*x))
y_time += time.time() - start
#print 'list(set().union(*x)):\t', y_time
start = time.time()
z = list(set(chain(*x)))
z_time += time.time() - start
#print 'list(set(chain(*x))):\t', z_time
assert sorted(y) == sorted(z)
#print
print y_time / 1000.
print z_time / 1000.
[出]:
1.39586925507e-05
1.09834671021e-05
取出强制转换集的变量列表:
y_time = 0
z_time = 0
for _ in range(1000):
x = [[random.choice(range(10000))
for i in range(10)] for j in range(10)]
start = time.time()
y = set().union(*x)
y_time += time.time() - start
start = time.time()
z = set(chain(*x))
z_time += time.time() - start
assert sorted(y) == sorted(z)
print y_time / 1000.
print z_time / 1000.
[出]:
1.22241973877e-05
1.02684497833e-05
这是我尝试打印中间时间(没有列表转换)时的完整输出:http://pastebin.com/raw/y3i6dXZ8
为什么list(set(chain(*x))) 比list(set().union(*x)) 花费的时间更少?
还有其他方法可以实现相同的列表联合吗?使用numpy 或pandas 或sframe 或其他什么? 替代方案更快吗?
【问题讨论】:
-
内部列表是否已排序?
-
不,内部列表没有明确排序。假设输入列表的顺序未知。
标签: python list numpy set union