Как разбить список на группы по 4, где первые элементы больше последних? - PullRequest
0 голосов
/ 29 января 2019

У меня есть список целых чисел, который я хочу разбить на группы по 4 элемента по условию:

result = [0, 4, 10, 6, 15, 9, 18, 35, 40, -30, -90, 99]

Первый элемент каждой группы должен быть больше четвертого следующего элемента.Вывод должен быть таким:

[[10, 6, 15, 9], [18, 35, 40, -30], [35, 40, -30, -90]]

но как мне применить эти условия в этом коде?

split_no = 4
list(split_list(result, split_no))

В настоящее время мой вывод выглядит следующим образом:

[[0, 4, 10, 6], [15, 9, 18, 35], [40, -30, -90, 99]]

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Сначала создается список всех подсписков длиной 4, используя Понимание списка Python :

input_list = [0, 4, 10, 6, 15, 9, 18, 35, 40, -30, -90, 99]

all_sublists = [input_list[i:i+4] for i in range(len(input_list)-3)]

print(all_sublists)
# [[0, 4, 10, 6], [4, 10, 6, 15], [10, 6, 15, 9], [6, 15, 9, 18], [15, 9, 18, 35], [9, 18, 35, 40], [18, 35, 40, -30], [35, 40, -30, -90], [40, -30, -90, 99]]

Затем подсписки фильтруются с использованием требуемогоусловия:

output = [sublist for sublist in all_sublists if sublist[0]>sublist[-1]]

print(output)
# [[10, 6, 15, 9], [18, 35, 40, -30], [35, 40, -30, -90]]

Однострочное решение может быть:

output = [input_list[i:i+4] for i in range(len(input_list)-3)
          if input_list[i]>input_list[i+3]]

print(output)
# [[10, 6, 15, 9], [18, 35, 40, -30], [35, 40, -30, -90]]
0 голосов
/ 29 января 2019

Ответы от xdze2 и gireesh4manu имеют недостаток хранения всех подпоследовательностей длины 4 в памяти.Мы можем избежать этого, используя итератор с плавающим окном .

Например, если взять один из этого ответа и немного его улучшить:

from itertools import islice, tee

def windows(iterable, size): 
    iterators = tee(iterable, size) 
    iterators = [islice(iterator, i, None) for i, iterator in enumerate(iterators)]  
    yield from map(list, zip(*iterators))

def is_valid(seq):
    return seq[0] > seq[-1]

result = [0, 4, 10, 6, 15, 9, 18, 35, 40, -30, -90, 99]
print(list(filter(is_valid, windows(result, 4))))

даст вам:

[[10, 6, 15, 9], [18, 35, 40, -30], [35, 40, -30, -90]]
0 голосов
/ 29 января 2019

Вы можете сделать следующее

arr1 = [0, 4, 10, 6, 15, 9, 18, 35, 40, -30, -90, 99]
arr2=[arr1[x:x+4] for x in range(0, len(arr1)) if len(arr1[x:x+4])==4]
for each in arr2[:]:
    if each[0]<=each[3]:
        arr2.remove(each)

Теперь, если вы попытаетесь распечатать arr2;

print(arr2)

, вы получите:

[[10, 6, 15, 9], [18, 35, 40, -30], [35, 40, -30, -90]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...