Объединение значений из 2 строк с использованием Python - PullRequest
0 голосов
/ 22 октября 2018

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

01-Jan-1990 0:00:01 A abcdefghi jklmnopq
01-Jan-1990 0:00:02 A abcdefghi xxxyyyvvv fefwwe qqqqq
01-Jan-1990 0:00:02   xwwwww xxxxxxx yyyy
01-Jan-1990 0:00:05 B qwerty qwerty
01-Jan 1990 0:00:06 C popopop qwqwqwq tytytyty sss

и в данных

[['01-Jan-1990 0:00:01','A','abcdefghi jklmnopq'],
 ['01-Jan-1990 0:00:02','A','abcdefghi xxxyyyvvv fefwwe qqqqq'],
 ['01-Jan-1990 0:00:02','\t','xwwwww xxxxxxx yyyy'],      #\t instead of empty
 ['01-Jan-1990 0:00:05','B','qwerty qwerty'],
 ['01-Jan 1990 0:00:06','C','popopop qwqwqwq tytytyty sss']]

Хотел бы спросить, есть ли способы объединитьзначение из строки 3 в строку строки 2, которые не имеют A,B,C?

Требуемый вывод, как показано ниже:

01-Jan-1990 0:00:01 A abcdefghi jklmnopq
01-Jan-1990 0:00:02 A abcdefghi xxxyyyvvv fefwwe qqqqq xwwwww xxxxxxx yyyy
01-Jan-1990 0:00:05 B qwerty qwerty
01-Jan 1990 0:00:06 C popopop qwqwqwq tytytyty sss

РЕДАКТИРОВАНИЕ С НУЖНЫМ ВЫХОДОМ и пропущенным полем

Ответы [ 4 ]

0 голосов
/ 22 октября 2018

Вот удобочитаемое решение с комментариями:)

EMPTY_MARKER = '\t'
LABEL_INDEX, VALUES_INDEX = 1, 2

# first pass to append rows with empty labels to previous row
for row in range(len(data) - 1):
    if data[row + 1][LABEL_INDEX] == EMPTY_MARKER:
        data[row][VALUES_INDEX] += ' {}'.format(data[row + 1][VALUES_INDEX])

# second pass to remove empty label rows
for row in data:
    if row[LABEL_INDEX] == EMPTY_MARKER:
        data.remove(row)

# visually readable way to display output :)
for row in data:
    print row

вывод:

['01-Jan-1990 0:00:01', 'A', 'abcdefghi jklmnopq']
['01-Jan-1990 0:00:02', 'A', 'abcdefghi xxxyyyvvv fefwwe qqqqq xwwwww xxxxxxx yyyy']
['01-Jan-1990 0:00:05', 'B', 'qwerty qwerty']
['01-Jan 1990 0:00:06', 'C', 'popopop qwqwqwq tytytyty sss']
0 голосов
/ 22 октября 2018

Если ваши данные хранятся в переменной data, вы можете использовать itertools.groupby, чтобы сгруппировать подсписки по их первому элементу, а затем использовать str.join, чтобы объединить последний элемент каждой группы с пробелом:

from itertools import groupby
from operator import itemgetter
[[*l[0][:-1], ' '.join(m for *_, m in l)] for k, g in groupby(data, key=itemgetter(0)) for l in (list(g),)]

Возвращает:

[['01-Jan-1990 0:00:01', 'A', 'abcdefghi jklmnopq'],
 ['01-Jan-1990 0:00:02', 'A', 'abcdefghi xxxyyyvvv fefwwe qqqqq xwwwww xxxxxxx yyyy'],
 ['01-Jan-1990 0:00:05', 'B', 'qwerty qwerty'],
 ['01-Jan 1990 0:00:06', 'C', 'popopop qwqwqwq tytytyty sss']]
0 голосов
/ 22 октября 2018
Решение

blhsing великолепно, но, скажем, у вас есть такие данные, как

01-Jan-1990 0:00:02 A abcdefghi xxxyyyvvv fefwwe qqqqq
01-Jan-1990 0:00:03 \t xwwwww xxxxxxx yyyy

Это не сработает, так как для группировки требуется [0] (время).

Так что япредоставить метод не использовать время.

[[*x[:-1], x[2] + ' ' + data[i+1][2] if (data[i+1][1] == '\t' if i < len(data)-1 else False) else x[2] ] for i, x in enumerate(data) if x[1] != '\t']
0 голосов
/ 22 октября 2018

Так как вы хотите изменить список (удалив элементы), повторение с for row in rows не будет работать, если вы не сохранили работающий список индексов, а затем сделали это позже (или создали отдельный список, если хотитечтобы избежать изменения оригинала и т. д.).Работа в обратном направлении, начиная с len(rows) - 1 и заканчивая 1, означает, что вы можете просто проверить rows[i] и, если необходимо, добавить его значение к значению rows[i-1]:

rows = [
    ['01-Jan-1990 0:00:01','A','abcdefghi jklmnopq'],
    ['01-Jan-1990 0:00:02','A','abcdefghi xxxyyyvvv fefwwe qqqqq'],
    ['01-Jan-1990 0:00:02', '','xwwwww xxxxxxx yyyy'],
    ['01-Jan-1990 0:00:05','B','qwerty qwerty'],
    ['01-Jan 1990 0:00:06','C','popopop qwqwqwq tytytyty sss'],
]

for i in range(len(rows) - 1, 0, -1):
    if not rows[i][1]:
        rows[i-1][2] += rows[i][2]
        del rows[i]

print("\n".join(" ".join(e for e in row) for row in rows))
# 01-Jan-1990 0:00:01 A abcdefghi jklmnopq
# 01-Jan-1990 0:00:02 A abcdefghi xxxyyyvvv fefwwe qqqqqxwwwww xxxxxxx yyyy
# 01-Jan-1990 0:00:05 B qwerty qwerty
# 01-Jan 1990 0:00:06 C popopop qwqwqwq tytytyty sss

Это предполагает, что rows[0] никогда не будетиметь пропущенное значение, которое, кажется, имеет смысл в контексте вашего вопроса.

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