Определение списка Python - вставка элементов или нет в зависимости от условия - PullRequest
0 голосов
/ 27 марта 2019

Я могу определить список так:

c = some_condition # True or False
l = [
    1, 2,   # always
    3 if c else 4
]
# l = [ 1, 2, 3 ] if c is True, [ 1, 2, 4 ] otherwise

Но как я могу определить список, который [1,2,3], если c истинно, [1,2] в противном случае?

l = [
    1, 2,
    3 if c    # syntax error
]

l = [
    1, 2,
    3 if c else None    # makes [1,2,None]
]

l = [
    1, 2,
    3 if c else []    # makes [1,2,[]]
]

# This is the best that I could do
l = (
    [
        1, 2,
    ]
    +
    ([3] if c1 else [])  # parentheses are mandatory
    )

# Of course, I know I could
l = [1, 2]
if c:
    l.append(3)

Кроме того, я хочу знать, как вставить несколько элементов, когда условие выполняется: например, 3, 4 вместо 3.

В Perl, например, я мог бы сделать:

@l = (
    1, 2,
    $c1 ? 3 : (),        # empty list that shall be flattened in outer list
    $c2 ? (4,5) : (6,7), # multiple elements
);

Ответы [ 3 ]

1 голос
/ 27 марта 2019

Самое близкое, к чему вы можете прийти, это использование отдельно определенной функции генератора:

def maker(condition):
    yield 1
    yield 2
    if condition:
        yield 3
        yield 4

print(list(maker(True)))
print(list(maker(False)))

Вывод:

[1, 2, 3, 4]
[1, 2]

Тем не менее, Python на самом деле не предназначен для таких операцийи поэтому они будут неуклюжими.В целом более идиоматично фильтровать список на основе предиката, либо создать логический массив идентичной формы numpy и использовать маскирование.

1 голос
/ 27 марта 2019
c = some_condition # True or False

l = [1, 2] + [x for x in [3] if c]
print(l)

вывод >>>

[1, 2, 3] # when c = True
[1, 2]    # when c = False

Вы можете расширить его, как пожелаете

l = [1, 2] + [x for x in [3] if c] + [x for x in [4] if not c]

вывод >>>

[1, 2, 3] # when c = True
[1, 2, 4]    # when c = False
0 голосов
/ 27 марта 2019

[x for x in range(1,5) if x<3 or c]

...