10

我知道你可以在 python 中做这样的事情:

>>> conditional = False
>>> x = [1 if conditional else 2, 3, 4]
[ 2, 3, 4 ]

但我该怎么做这样的事情?

>>> conditional = False
>>> x = [1 if conditional, 3, 4]
[ 3, 4 ]

也就是说,我不想用1另一个数字代替。conditional如果是假的,我想简单地省略它。

4

4 回答 4

15

使用串联:

x = ([1] if conditional else []) + [3, 4]

换句话说,生成一个包含可选元素或为空的子列表。

演示:

>>> conditional = False
>>> ([1] if conditional else []) + [3, 4]
[3, 4]
>>> conditional = True
>>> ([1] if conditional else []) + [3, 4]
[1, 3, 4]

当然,这个概念也适用于更多元素:

x = ([1, 2, 3] if conditional else []) + [4, 5, 6]
于 2013-09-24T18:03:59.917 回答
2

你可以用一片来做

x = [1, 3, 4][not conditional:]

例如

>>> conditional = False
>>> [1, 3, 4][not conditional:]
[3, 4]
>>> conditional = True
>>> [1, 3, 4][not conditional:]
[1, 3, 4]
于 2013-09-24T18:14:37.373 回答
1

比 Python 3.5+ 中的https://stackoverflow.com/a/18988829/1093967略快(利用 PEP-448 引入的额外解包泛化):

>>> timeit("([1, 2, 3] if True else []) + [4, 5, 6]")
0.10665618600614835
>>> timeit("[*([1, 2, 3] if True else []), 4, 5, 6]")
0.08992647400009446
于 2020-03-14T06:24:35.533 回答
0

如果你真的想避免else,你可以为列表项编写一个生成器:

def gen_x(conditional):
    if conditional:
        yield 1
    for v in [3, 4]:
        yield v

或者,从 Python 3.3 开始

def gen_x(conditional):
    if conditional:
        yield 1
    yield from [3, 4]

接着:

x = list(gen_x(conditional))
于 2017-06-13T14:54:55.797 回答