从列表的双端队列中提取“列”

时间:2019-12-07 17:42:33

标签: list list-comprehension

我有一长串由4个元素组成的列表。 如何有效地从中提取列? 我现在使用的理解列表如下:

S = [s [0] for sample_D中的s]
   R = [s [2] for sample_D中的s]

我不确定这是否是最有效的方法。

1 个答案:

答案 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