Python使用列表推导定义列表中的元素

was*_*zil -2 python list-comprehension list

我想知道是否可以通过列表理解来定义列表定义中的一系列元素.我希望通过以下方式实现这样的目标:

>> ['a', 'b', 1, 2, 3, 'c']
Run Code Online (Sandbox Code Playgroud)

我试过这个:

result_list = ['a', 'b', [i for i in range(3)] 'c']
Run Code Online (Sandbox Code Playgroud)

但这会产生 ['a', 'b', [1, 2, 3], 'c']

或者,如果我尝试使用元组,我会得到一个像这样的生成器对象: ['a', 'b', <generator object <genexpr> at 0x0000000002C9A9E8>, 'c']

能以某种方式完成吗?谢谢!

Vie*_*han 6

这就是你需要的:

result_list = ['a', 'b', *[i for i in range(3)], 'c']
print(result_list)  # ['a', 'b', 0, 1, 2, 'c']
Run Code Online (Sandbox Code Playgroud)


PM *_*ing 5

在最新版本的Python 3中,您可以在列表定义中使用星形解包:

result_list = ['a', 'b', *[i for i in range(3)], 'c']
print(result_list)
Run Code Online (Sandbox Code Playgroud)

产量

['a', 'b', 0, 1, 2, 'c']
Run Code Online (Sandbox Code Playgroud)

请记住,如果在列表中混合数据类型,它可能会变得混乱.如果你想要一个异构集合,通常最好使用一个元组.


同时请注意

[[i for i in range(u)] for u in range(3)]
Run Code Online (Sandbox Code Playgroud)

是有效的,并将产生

[[], [0], [0, 1]]
Run Code Online (Sandbox Code Playgroud)

你不能通过这样做获得扁平版本

[*[i for i in range(u)] for u in range(3)]
Run Code Online (Sandbox Code Playgroud)

如果你坚持使用旧版本的Python,最好的选择是使用itertools.chain.from_iterable:

import itertools

src = ['a', 'b', [i for i in range(3)], 'c']
result_list = list(itertools.chain.from_iterable(src))
Run Code Online (Sandbox Code Playgroud)

  • `['a','b',*range(3),'c']`的效果很好. (2认同)