解压缩python列表中的元组(不能使用* -operator)

时间:2016-05-17 14:56:38

标签: python tuples list-comprehension iterable-unpacking

我正在尝试根据另一个列表创建一个列表,连续重复3次相同的值。

目前,我正在使用:

>>> my_list = [ 1, 2 ]
>>> three_times = []
>>> for i in range( len( my_list ) ):
...   for j in range( 3 ):
...     three_times.append( my_list[ i ] )
...
>>> print three_times
[1, 1, 1, 2, 2, 2]

但我想用更多的Pythonic方式来做,例如:

>>> my_list = [ 1, 2 ]
>>> three_times = []
>>> three_times = [ (value,) * 3 for value in my_list ]
>>> print three_times
[(1, 1, 1), (2, 2, 2)]

但是,我找不到解开元组的方法。

three_times = [ *( (value,) * 3 ) for value in my_list ]之类的东西非常适合解包元组,但这不是一个正确的语法。

2 个答案:

答案 0 :(得分:14)

您不能在列表推导中使用*可迭代解包,该语法仅在调用中可用,而在Python 3中,在使用赋值时。

如果你想使用列表理解,只需将你的for循环串联起来;你确实希望直接访问my_list的值而不是生成索引:

[v for v in my_list for _ in range(3)]

答案 1 :(得分:4)

接受的答案是正确的,但我做了一些效率测试,所以分享给路人。

总结:使用 chain.from_iterable 比列表理解提高 ~x2 速度。如果您不介意导入 np.repeat,请使用 numpy 来提高 ~x6 速度,但如果最终转换回 {{1},不要使用 np.repeat }}。

list