拆分和替换二维列表中的字符串
Splitting and replacing strings in a 2D list
我有一组数据如下图:
[['05-Feb-2001 12:00:01','A','<>TG:MIN MAX W1 GRN RED'],
['05-Feb-2001 12:00:01','B','MIN MAX'],
['05-Feb-2001 12:00:07','A','<i>TG:MAX MIN W2'],
['05-Feb-2001 12:00:07','C','MAX RED GRN'],
['05-Feb-2001 12:00:20','A','MIN MAX RED'],
['05-Feb-2001 12:01:00','A','<i>TG:MAX MIN RED GRN']]
如该行的 3 值所示,它可能包含也可能不包含“<>TG”。我想检测
"<i>"
并将其从字符串中拆分出来,然后将其添加成为第 4 列
所需的输出将是
[['05-Feb-2001 12:00:01', 'A', '<>TG:MIN MAX W1 GRN RED'],
['05-Feb-2001 12:00:01', 'B', 'MIN MAX'],
['05-Feb-2001 12:00:07', 'A', 'TG:MAX MIN W2', '<i>'],
['05-Feb-2001 12:00:07', 'C', 'MAX RED GRN'],
['05-Feb-2001 12:00:20', 'A', 'MIN MAX RED'],
['05-Feb-2001 12:01:00', 'A', 'TG:MAX MIN RED GRN', '<i>']]
请指教!
这对你有用吗?只需遍历子列表并就地更新。
for l in lst:
if '<i>TG' in l[-1]:
l[-1] = l[-1].replace('<i>', '')
l.append('<i>')
print(lst)
[['05-Feb-2001 12:00:01', 'A', '<>TG:MIN MAX W1 GRN RED'],
['05-Feb-2001 12:00:01', 'B', 'MIN MAX'],
['05-Feb-2001 12:00:07', 'A', 'TG:MAX MIN W2', '<i>'],
['05-Feb-2001 12:00:07', 'C', 'MAX RED GRN'],
['05-Feb-2001 12:00:20', 'A', 'MIN MAX RED'],
['05-Feb-2001 12:01:00', 'A', 'TG:MAX MIN RED GRN', '<i>']]
如果要检查字符串开头的标记,请更改
if '<i>TG' in l[-1]
到
if l[-1].startswith('<i>TG')
(您不需要正则表达式。)
更短,使用list comprehension
:
print([[y if x!=2 else y.replace('<i>','') for x,y in enumerate(i)]+['<i>'] if '<i>' in i[-1] else i for i in lst])
或者如果想要在开头:
print([[y if x!=2 else y.lstrip('<i>') for x,y in enumerate(i)]+['<i>'] if i[-1].startswith('<i>') else i for i in lst])\
两者输出:
[['05-Feb-2001 12:00:01', 'A', '<>TG:MIN MAX W1 GRN RED'],
['05-Feb-2001 12:00:01', 'B', 'MIN MAX'],
['05-Feb-2001 12:00:07', 'A', 'TG:MAX MIN W2', '<i>'],
['05-Feb-2001 12:00:07', 'C', 'MAX RED GRN'],
['05-Feb-2001 12:00:20', 'A', 'MIN MAX RED'],
['05-Feb-2001 12:01:00', 'A', 'TG:MAX MIN RED GRN', '<i>']]
您可以编写一个函数来检查列表数据列表中的一个条目,然后map
将其应用于列表:
data = [['05-Feb-2001 12:00:01','A','<>TG:MIN MAX W1 GRN RED'],
['05-Feb-2001 12:00:01','B','MIN MAX'],
['05-Feb-2001 12:00:07','A','<i>TG:MAX MIN W2'],
['05-Feb-2001 12:00:07','C','MAX RED GRN'],
['05-Feb-2001 12:00:20','A','MIN MAX RED'],
['05-Feb-2001 12:01:00','A','<i>TG:MAX MIN RED GRN']]
def separate(entry, separator='<i>', position=2):
return [
el.replace(separator, '') if idx==position else el for idx, el in enumerate(entry)] + (
[] if not separator in entry[position]
else [separator]
)
from itertools import repeat
map(separate, data, repeat('<i>'), repeat(2))
Out[26]:
[['05-Feb-2001 12:00:01', 'A', '<>TG:MIN MAX W1 GRN RED'],
['05-Feb-2001 12:00:01', 'B', 'MIN MAX'],
['05-Feb-2001 12:00:07', 'A', 'TG:MAX MIN W2', '<i>'],
['05-Feb-2001 12:00:07', 'C', 'MAX RED GRN'],
['05-Feb-2001 12:00:20', 'A', 'MIN MAX RED'],
['05-Feb-2001 12:01:00', 'A', 'TG:MAX MIN RED GRN', '<i>']]
注意:如果您使用 python 2.x,则 repeat
需要额外的参数 times=len(data)
.
我有一组数据如下图:
[['05-Feb-2001 12:00:01','A','<>TG:MIN MAX W1 GRN RED'],
['05-Feb-2001 12:00:01','B','MIN MAX'],
['05-Feb-2001 12:00:07','A','<i>TG:MAX MIN W2'],
['05-Feb-2001 12:00:07','C','MAX RED GRN'],
['05-Feb-2001 12:00:20','A','MIN MAX RED'],
['05-Feb-2001 12:01:00','A','<i>TG:MAX MIN RED GRN']]
如该行的 3 值所示,它可能包含也可能不包含“<>TG”。我想检测
"<i>"
并将其从字符串中拆分出来,然后将其添加成为第 4 列
所需的输出将是
[['05-Feb-2001 12:00:01', 'A', '<>TG:MIN MAX W1 GRN RED'],
['05-Feb-2001 12:00:01', 'B', 'MIN MAX'],
['05-Feb-2001 12:00:07', 'A', 'TG:MAX MIN W2', '<i>'],
['05-Feb-2001 12:00:07', 'C', 'MAX RED GRN'],
['05-Feb-2001 12:00:20', 'A', 'MIN MAX RED'],
['05-Feb-2001 12:01:00', 'A', 'TG:MAX MIN RED GRN', '<i>']]
请指教!
这对你有用吗?只需遍历子列表并就地更新。
for l in lst:
if '<i>TG' in l[-1]:
l[-1] = l[-1].replace('<i>', '')
l.append('<i>')
print(lst)
[['05-Feb-2001 12:00:01', 'A', '<>TG:MIN MAX W1 GRN RED'],
['05-Feb-2001 12:00:01', 'B', 'MIN MAX'],
['05-Feb-2001 12:00:07', 'A', 'TG:MAX MIN W2', '<i>'],
['05-Feb-2001 12:00:07', 'C', 'MAX RED GRN'],
['05-Feb-2001 12:00:20', 'A', 'MIN MAX RED'],
['05-Feb-2001 12:01:00', 'A', 'TG:MAX MIN RED GRN', '<i>']]
如果要检查字符串开头的标记,请更改
if '<i>TG' in l[-1]
到
if l[-1].startswith('<i>TG')
(您不需要正则表达式。)
更短,使用list comprehension
:
print([[y if x!=2 else y.replace('<i>','') for x,y in enumerate(i)]+['<i>'] if '<i>' in i[-1] else i for i in lst])
或者如果想要在开头:
print([[y if x!=2 else y.lstrip('<i>') for x,y in enumerate(i)]+['<i>'] if i[-1].startswith('<i>') else i for i in lst])\
两者输出:
[['05-Feb-2001 12:00:01', 'A', '<>TG:MIN MAX W1 GRN RED'],
['05-Feb-2001 12:00:01', 'B', 'MIN MAX'],
['05-Feb-2001 12:00:07', 'A', 'TG:MAX MIN W2', '<i>'],
['05-Feb-2001 12:00:07', 'C', 'MAX RED GRN'],
['05-Feb-2001 12:00:20', 'A', 'MIN MAX RED'],
['05-Feb-2001 12:01:00', 'A', 'TG:MAX MIN RED GRN', '<i>']]
您可以编写一个函数来检查列表数据列表中的一个条目,然后map
将其应用于列表:
data = [['05-Feb-2001 12:00:01','A','<>TG:MIN MAX W1 GRN RED'],
['05-Feb-2001 12:00:01','B','MIN MAX'],
['05-Feb-2001 12:00:07','A','<i>TG:MAX MIN W2'],
['05-Feb-2001 12:00:07','C','MAX RED GRN'],
['05-Feb-2001 12:00:20','A','MIN MAX RED'],
['05-Feb-2001 12:01:00','A','<i>TG:MAX MIN RED GRN']]
def separate(entry, separator='<i>', position=2):
return [
el.replace(separator, '') if idx==position else el for idx, el in enumerate(entry)] + (
[] if not separator in entry[position]
else [separator]
)
from itertools import repeat
map(separate, data, repeat('<i>'), repeat(2))
Out[26]:
[['05-Feb-2001 12:00:01', 'A', '<>TG:MIN MAX W1 GRN RED'],
['05-Feb-2001 12:00:01', 'B', 'MIN MAX'],
['05-Feb-2001 12:00:07', 'A', 'TG:MAX MIN W2', '<i>'],
['05-Feb-2001 12:00:07', 'C', 'MAX RED GRN'],
['05-Feb-2001 12:00:20', 'A', 'MIN MAX RED'],
['05-Feb-2001 12:01:00', 'A', 'TG:MAX MIN RED GRN', '<i>']]
注意:如果您使用 python 2.x,则 repeat
需要额外的参数 times=len(data)
.