使用python组合来自两行的值

2024-06-28 15:31:34 发布

您现在位置: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

在数据方面

^{pr2}$

想问一下是否有任何方法可以将第3行的值合并到第2行的字符串中,而第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

使用所需输出和缺失字段进行编辑


Tags: 数据jansssqwertyyyyyxxxxxxxqqqqqabcdefghi
3条回答

以下是一个可消化的解决方案,并附有注释:)

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

输出:

^{pr2}$

假设您的数据存储在变量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),)]

这将返回:

^{pr2}$

由于您希望更改列表(通过删除元素),所以使用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]永远不会缺少一个值,这在您的问题上下文中似乎是有意义的。在

相关问题 更多 >