Как вставить пустую строку в список, если между совпадениями нет 3 строк - PullRequest
0 голосов
/ 11 января 2019

Как вставить пустую строку в список, если между совпадениями нет 3 строк. Я хочу выяснить, является ли каждый 4-й элемент каким-либо числом (т. Е. 12.1234., 1.12.13 и т. Д.), И если нет, я хочу вставить пустую строку перед вторым числом, чтобы между каждым соответствием всегда было 3 строки.

  list =  ['1.1', 'ab','ac','','1.2','dd','','1.3','cb','dd','', '1.4', 'de','']
  wanted_list =['1.1', 'ab','ac','','1.2','dd','','', '1.3','cb','dd','', '1.4', 'de','','']

Это то, что я получил до сих пор, но цикл никогда не заканчивается и вставляет путь ко многим пустым строкам в конце (не только когда между совпадениями нет 3 строк).

list =  ['1.1', 'ab','ac','','1.2','dd','','1.3','cb','dd','', '1.4', 'de','']
start_rx = re.compile('|'.join(
    ['\d\d\.\d\d\.\d\d\.\d\d\d', '\d\d\.\d\d\.\d\d\.', '\d\d\.\d\d\d\d', '\d\.\d\.\d\.', '\d\.\d\.\d\.\d\d\.',
     '\d\.\d\.\d\.\d\d\d\.', 'A\d\d\d\d', '^\d\.', '^\d\.\d', '^\d\.\d\.\d', '^\d\.\d\.\d\d', '\d\d\.\d\d\.\d\d\d\d', '\d.\d']))
count = 1
for i, line in enumerate(list):
    count += 4
    if re.match(start_rx, line):
        pass
    else:
        i=count
        list.insert(i, '')
        print (list)

1 Ответ

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

Следующий подход группирует список во вложенные списки цифр / десятичных значений и других и выполняет итерации по недицифрованным / десятичным группам (нечетные индексированные группы), чтобы определить, содержат ли они требуемые 3 элемента, и при необходимости заполнить пустыми строками. , Вы можете использовать регулярное выражение в функции isfloat(), приведенной ниже, в соответствии с вашей первоначальной попыткой, но, кажется, проще просто проверить цифры после удаления десятичных дробей.

from itertools import groupby

def isfloat(s):
    return s.replace('.','').isdigit()

items =  ['1.1', 'ab','ac','','1.2','dd','','1.3','cb','dd','', '1.4', 'de','']
groups = [list(g) for _,g in groupby(items, key=isfloat)]
for group in groups[1::2]:
    group += [''] * (3 - len(group))

result = [item for group in groups for item in group]
print(result)
# OUTPUT
# ['1.1', 'ab', 'ac', '', '1.2', 'dd', '', '', '1.3', 'cb', 'dd', '', '1.4', 'de', '', '']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...