Удалить последовательные повторяющиеся слова, разделенные разделителем - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь удалить последовательный дубликат, разделенный разделителем '>', из столбца командировки, а также агрегировать значения в столбце uu и conv. Я попытался

INPUT

a=[['journey', 'uu', 'convs'],
 ['Ct', '10', '2'],
 ['Ct>Ct', '100', '3'],
 ['Ct>Pt>Ct', '200', '10'],
 ['Ct>Pt>Ct>Ct', '40', '5'],
 ['Ct>Pt>Bu', '1000', '8']]

OUTPUT

a=[['journey', 'uu', 'convs'],
 ['Ct', '110', '5'],
 ['Ct>Pt>Ct', '240', '15'],
 ['Ct>Pt>Bu', '1000', '8']]

Я попытался разделить ниже, но это не сработало

 a='>'.join(set(a.split()))

1 Ответ

0 голосов
/ 31 октября 2019

Вам нужно разделить вашу строку на >, а затем вы можете использовать groupby для удаления дублирующихся элементов в вашей строке. Например:

x = ['Ct>Pt>Ct>Ct', '40', '5']
print(">".join([i for i, _ in groupby(x[0].split(">"))]))
# 'Ct>Pt>Ct'

Вы можете использовать это как лямбда-функцию в другой группе для объединения списков. Затем суммируйте каждый элемент одного и того же индекса, используя zip. Проверьте это:

a=[['journey', 'uu', 'convs'],
 ['Ct', '10', '2'],
 ['Ct>Ct', '100', '3'],
 ['Ct>Pt>Ct', '200', '10'],
 ['Ct>Pt>Ct>Ct', '40', '5'],
 ['Ct>Pt>Bu', '1000', '8']]

from itertools import groupby

result = [a[0]]  # Add header
groups = groupby(
    a[1:],
    key=lambda x: ">".join([i for i, _ in groupby(x[0].split(">"))])
)
# groups:
# ['Ct, '[['Ct', '10', '2'], ['Ct>Ct', '100', '3']]]
# ['Ct>Pt>Ct', [['Ct>Pt>Ct', '200', '10'], ['Ct>Pt>Ct>Ct', '40', '5']]]
# ['Ct>Pt>Bu', [['Ct>Pt>Bu', '1000', '8']]]

for key, items in groups:
  row = [key]
  for i in zip(*items):
    if i[0].isdigit():
      row.append(str(sum(map(int, i))))
  result.append(row)
print(result)

Отпечатки:

[['journey', 'uu', 'convs'],
 ['Ct', '110', '5'],
 ['Ct>Pt>Ct', '240', '15'],
 ['Ct>Pt>Bu', '1000', '8']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...