我在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
编辑了所需的输出且缺少字段
答案 0 :(得分:1)
假设您的数据存储在变量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']]
答案 1 :(得分:0)
由于您要更改列表(通过删除元素),因此除非您保留要删除的运行索引列表,然后再执行此操作(或构造一个单独的列表,否则用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]
永远不会有缺失值,这在您的问题中似乎很有意义。
答案 2 :(得分:0)
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']
答案 3 :(得分:-1)
以下是带有注释的可消化解决方案:)
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']