使用 python 合并 2 行的值
Combining values from 2 rows using python
我有一个二维数组数据,在 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 行的值合并到没有 A,B,C
的第 2 行的字符串中?
期望的输出如下:
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
已使用所需输出和缺失字段进行编辑
由于您要更改列表(通过删除元素),因此使用 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]
永远不会有缺失值,这在您的问题的上下文中似乎是有意义的。
假设您的数据存储在变量 data
中,您可以使用 itertools.groupby
按第一项对子列表进行分组,然后使用 str.join
加入每个组的最后一项space:
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),)]
这个returns:
[['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']]
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']
这是一个带有评论的易于理解的解决方案:)
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']
我有一个二维数组数据,在 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 行的值合并到没有 A,B,C
的第 2 行的字符串中?
期望的输出如下:
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
已使用所需输出和缺失字段进行编辑
由于您要更改列表(通过删除元素),因此使用 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]
永远不会有缺失值,这在您的问题的上下文中似乎是有意义的。
假设您的数据存储在变量 data
中,您可以使用 itertools.groupby
按第一项对子列表进行分组,然后使用 str.join
加入每个组的最后一项space:
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),)]
这个returns:
[['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']]
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']
这是一个带有评论的易于理解的解决方案:)
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']