Найти цифры в списке и объединить все элементы между цифрами в Python - PullRequest
3 голосов
/ 29 октября 2019

У меня есть список, который выглядит примерно так:

list1 = ['390140', 'string3', 'string2', '631019', 'string1', '', '6059152', 'string4', 'string5', '', '6951201', 'string6']

Я должен преобразовать этот список в список словарей, как показано ниже:

list2 = [{'code':'390140','description': 'string3 string2'}, {'code':'631019','description':'string1 '},{'code':'6051952','description': 'string4 string5', ...]

, тогда как каждая цифра являетсяcode и следующие строки description. Я попытался индексировать цифры и затем разделить основной список на подсписки, как показано в моем подходе ниже. Этот подход не работает.

#x = [item for item in list1 if item.isdigit()]

idx = [idx for idx, item in enumerate(list1) if item.isdigit()]

for i in idx:
    list2.append({'code': list1[i], 'description': ' '.join(list1[idx[i]:idx[i+1]])})

list2 - это вывод, который я хочу получить.

Ответы [ 3 ]

1 голос
/ 29 октября 2019

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

list1 = ['390140', 'string3', 'string2', '631019', 'string1', '', '6059152', 'string4', 'string5', '', '6951201', 'string6']

idxs = [idx for idx, item in enumerate(list1) if item.isdigit()]
idxs.append(len(list1))

list2 = []
for index, idx in enumerate(idxs[:-1]):
    code = list1[idx]
    desc = ' '.join(list1[idx + 1 : idxs[index + 1]])
    list2.append({'code': code, 'description': desc})

print(list2)

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

Затем я перечисляю по этим индексам, кроме фиктивного конечного, чтобы найти code непосредственно из list1 и описания от следующего элемента к одному до следующего code.

1 голос
/ 29 октября 2019

Вот полный пример: цикл по каждому элементу el в list1. Если это цифра, это код. В противном случае это часть описания. Заполните list2 диктовками d этого формата, причем d['description'] изначально является списком описания str с. Как только начинается новый код, объедините все str в описании list вместе.

list1 = ['390140', 'string3', 'string2', '631019', 'string1', '', '6059152', 'string4', 'string5', '', '6951201', 'string6']

list2 = []
d = None
for el in list1:
    if not el.isdigit():
        # This is (part of) the description
        if el:  # Only append non-empty elements
            d['description'].append(el)
        continue
    # Join elements of old description
    if d:  # Only do this if d exists
        d['description'] = ' '.join(d['description'])
    # Begin new dict
    d = {'code': el, 'description': []}
    list2.append(d)
# Join elements of the last description
d['description'] = ' '.join(d['description'])

print(list2)
0 голосов
/ 29 октября 2019

Использование itertools groupby для создания групп, построение строки из групп и разбиение на пары для создания словаря (при написании этого было опубликовано аналогичное решение от RomanPerekhrest, сохранив его как немного отличающийся):

from itertools import groupby
list1 = ['390140', 'string3', 'string2', '631019', 'string1', '', '6059152', 'string4', 'string5', '', '6951201', 'string6']
pairwise = [' '.join([*group]) for _, group in groupby(list1, key=str.isdigit)]
[{'code': c, 'description': d} for (c, d) in zip(*[iter(pairwise)] * 2)]
...