Разделение и замена строк в 2D-списке - PullRequest
0 голосов
/ 22 октября 2018

У меня есть набор данных, как показано ниже:

[['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>']]

Пожалуйста, совет!

Ответы [ 3 ]

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

Еще короче, используйте 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>']]
0 голосов
/ 22 октября 2018

Вы можете написать функцию для проверки одной записи в списке данных списков, а затем 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>']]

Примечание. Если вы используете python2.x, тогда repeat нужен дополнительный аргумент times=len(data).

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

Это работает для вас?Просто переберите списки и обновите их на месте.

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')

(вам не нужно регулярное выражение.)

...