Как разбить кусок на два куска в списке на основе условия в python?

avatar
Naaga A
8 апреля 2018 в 05:56
158
2
0

Приведенный пример

list = [[2, 3, 4], [3,4,5,6,7]]

Я хочу разделить фрагменты в данном примере списка, если какой-либо фрагмент имеет значение больше значения 4.

Поэтому вывод должен быть

[[2, 3, 4], [3,4], [5, 6,7]].

Каким-то образом я получил требуемый ответ, но я просто хочу знать,

Есть ли в 'Python' однострочный оператор или функция, которая выдаст требуемый результат на основе заданного условия?

Источник
atiq1589
8 апреля 2018 в 05:57
0

Пожалуйста, опубликуйте свой код.

user202729
8 апреля 2018 в 05:59
2

Почему люди продолжают просить однострочный код, хотя им нужен читабельный код?

user202729
8 апреля 2018 в 06:04
0

Возможный дубликат Python: разделить список на основе условия?

Ответы (2)

avatar
migjimen
8 апреля 2018 в 11:59
1

Как подсказал кто-то в комментариях, другие способы сделать это были бы более читабельными, но я играю, как это сделать с помощью одной строки кода просто для удовольствия:

list = [[2, 3, 4], [3,4,5,6,7]]
new_list = [a for b in [[[x for x in y if x <= 4], [x for x in y if x > 4]] for y in list] for a in b if a]
print(new_list)

результат: [[2, 3, 4], [3, 4], [5, 6, 7]]

avatar
Brendan Abel
8 апреля 2018 в 06:20
0

Возможно, вам следует использовать генератор фрагментов

def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        yield l[i:i + n]

Затем вы можете передать свой список через функцию-генератор, которая будет разбивать списки 2-го уровня

def chunk_items(l, n):
    for sub_l in l:
        yield from chunks(sub_l, n)

Или, если вы используете python<3.3

def chunk_items(l, n):
    for sub_l in l:
        for x in chunks(sub_l, n):
            yield x

Они возвращают генератор, но если вы действительно хотите превратить его в список.

new_list = [x for x in chunk_items(lst, 3)]

РЕДАКТИРОВАТЬ:

Только что увидел в вашем вопросе, что вы хотите разбивать наборы по 3 только в том случае, если длина подсписков больше 5, вот как вы можете изменить блокировщик, чтобы сделать это.

def chunk_items(l, n=3, m=5):
    for sub_l in l:
        if len(sub_l) > m:
            yield from chunks(sub_l, n)
        else:
            yield sub_l