Как сгруппировать элементы в списке, используя ярлыки внутри элементов? - PullRequest
0 голосов
/ 04 марта 2020

Есть список вроде:

list_a = [('B-DATE', '07'),('I-DATE', '/'),('I-DATE', '08'),('I-DATE', '/'),('I-DATE', '20'),('B-LAW', 'Abc'),('I-LAW', 'def'),('I-LAW', 'ghj'),('I-LAW', 'klm')]

Мне нужно объединиться list_a[x][1] элементы в соответствии с метками list_a[x][0]: «начать с буквы B» и все до следующего «B-старт» - метка (list_a[x][0]):

list_b = ['07/08/20','Abcdefghjklm']

Как при использовании stringagg + groupby в Oracle :)

Ответы [ 4 ]

1 голос
/ 04 марта 2020

Это один подход, использующий простую итерацию с str.startswith.

Пример:

list_a = [('B-DATE', '07'),('I-DATE', '/'),('I-DATE', '08'),('I-DATE', '/'),('I-DATE', '20'),('B-LAW', 'Abc'),('I-LAW', 'def'),('I-LAW', 'ghj'),('I-LAW', 'klm')]
res = []
for k, v in list_a:
    if k.startswith("B"):   #Check starts with `B`
        res.append(v)
    else:
        res[-1]+= v
print(res)

Выход:

['07/08/20', 'Abcdefghjklm']
0 голосов
/ 04 марта 2020

Решение с одной строкой

Вот ответ с одной строкой, использующий список-понимание . Хитрость заключается в использовании четко различимого разделителя (я использовал '|||'), добавляемого к значению , которое появляется при каждом новом появлении 'B'.

str(''.join([f'|||{v}' if k.startswith("B") else v for (k, v) in list_a])).split('|||')[1:]

Вывод :

['07/08/20', 'Abcdefghjklm']

Алгоритм

  1. Создать список значений, где значения соответствуют каждому новому вхождению 'B' предшествует '|||'.
  2. Объединить все элементы в списке в одну строку.
  3. Разделить строку разделителем, '|||'.
  4. Сохранить все элементы, кроме первого, для str.split().
0 голосов
/ 04 марта 2020

Это мой вариант, но я надеюсь, что есть более «современный» способ сделать это на python:

list_b = []
for i in range(len(list_a)):
    if list_a[i][0][0] == 'B':
      list_b += [list_a[i][1]]
    else:
      list_b[len(list_b)-1] += list_a[i][1]    
print(list_b)
0 голосов
/ 04 марта 2020

Вы можете попробовать это ниже:

        output = []
        for obj in list_a:
            if obj[0].startswith('B'):
                output.append(obj[1])
            else:
                output[-1] += obj[1]
        print(output)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...