我有一长串由4个元素组成的列表。 如何有效地从中提取列? 我现在使用的理解列表如下:
S = [s [0] for sample_D中的s]
R = [s [2] for sample_D中的s]
我不确定这是否是最有效的方法。
答案 0 :(得分:1)
让我们举个例子:
>>> sample_D = [(i, i+1, i+2, i+3) for i in range(0, 1000, 4)]
>>> sample_D
[(0, 1, 2, 3), (4, 5, 6, 7), ..., (996, 997, 998, 999)]
zip
函数可用于转置矩阵:
返回一个元组的迭代器,其中第i个元组包含每个参数序列或可迭代对象中的第i个元素。
>>> list(zip(*sample_D))
[(0, 4, 8, ..., 988, 992, 996), (1, 5, ..., 993, 997), (2, 6, ..., 994, 998), (3, 7, ..., 995, 999)]
列表理解返回列表,而zip方法返回元组,但内容相同:
>>> def using_list_comp(sample, indices):
... return tuple([t[i] for t in sample] for i in indices)
>>> def using_zip(sample, indices):
... z = list(zip(*sample))
... return tuple(z[i] for i in indices)
>>> assert using_list_comp(sample_D, [0, 1, 2, 3]) == tuple(list(t) for t in using_zip(sample_D, [0, 1, 2, 3]))
如果只需要一列,则列表理解速度更快:
>>> import timeit
>>> timeit.timeit(lambda: using_list_comp(sample_D,[0]))
6.561095703000319
>>> timeit.timeit(lambda: using_zip(sample_D,[0]))
10.13769362000312
但是,如果您需要多列,则zip方法会更快:
>>> timeit.timeit(lambda: using_list_comp(sample_D,[0, 1, 2, 3]))
25.433326307000243
>>> timeit.timeit(lambda: using_zip(sample_D,[0, 1, 2, 3]))
10.10265000200161