Создание неправильного списка списков из одного списка - PullRequest
2 голосов
/ 26 апреля 2019

Я пытаюсь создать список списков из одного списка.Я могу сделать это, если новый список списков имеет одинаковое количество элементов, однако это не всегда будет так

Как было сказано ранее, функция ниже работает, когда список списков имеет одинаковое количество элементов.количество элементов.

Я пытался использовать регулярные выражения, чтобы определить, соответствует ли элемент шаблону, используя pattern2=re.compile(r'\d\d\d\d\d\d'), потому что первое значение в моем новом списке списков всегда будет 6 цифрами, и оно будет единственнымтот, который следует за этим форматом.Однако я не уверен в синтаксисе, заставляющем его останавливаться на следующем совпадении и создавать другой список

def chunks(l,n):
    for i in range(0,len(l),n):
        yield l[i:i+n]

Приведенный выше код работает, если список списков будет содержать такое же количество элементов

Ниже я ожидаю.

OldList=[111111,a,b,c,d,222222,a,b,c,333333,a,d,e,f]
DesiredList=[[111111,a,b,c,d],[222222,a,b,c],[333333,a,d,e,f]]

Большое спасибо.

Приветствия

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Вероятно, гораздо более эффективный способ сделать это (с меньшим количеством циклов), но вот один из подходов, который находит индексы точек останова и затем разрезает список от индекса к индексу, добавляя None к концу списка индексов. чтобы захватить оставшиеся предметы. Если ваши 6-значные числа действительно строки, то вы можете исключить str() внутри re.match().

import re

d = [111111,'a','b','c','d',222222,'a','b','c',333333,'a','d','e','f']      

indexes = [i for i, x in enumerate(d) if re.match(r'\d{6}', str(x))]
groups = [d[s:e] for s, e in zip(indexes, indexes[1:] + [None])]
print(groups)
# [[111111, 'a', 'b', 'c', 'd'], [222222, 'a', 'b', 'c'], [333333, 'a', 'd', 'e', 'f']]
0 голосов
/ 02 мая 2019

Вы можете использовать фолд.

Сначала определите функцию для определения флага запуска:

>>> def is_start_flag(v):
...     return len(v) == 6 and v.isdigit()

Это будет полезно, если флаги не совсем такие, как вы ожидали, или чтобы исключить ложные срабатывания, или даже если вам нужно регулярное выражение.

Затем используйте functools.reduce:

>>> L = d = ['111111', 'a', 'b', 'c', 'd', '222222', 'a', 'b', 'c', '333333', 'a', 'd', 'e', 'f']
>>> import functools
>>> functools.reduce(lambda acc, x: acc+[[x]] if is_start_flag(x) else acc[:-1]+[acc[-1]+[x]], L, [])
[['111111', 'a', 'b', 'c', 'd'], ['222222', 'a', 'b', 'c'], ['333333', 'a', 'd', 'e', 'f']]

Если следующий элемент x является начальным флагом, тогда добавьте новый список [x] к аккумулятору. Иначе, добавьте элемент в текущий список, т.е. последний список аккумулятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...