2013-03-18 2 views
1

У меня есть список, который содержит много записей, которые сами являются списками. Вот некоторые из подсписков в главном списке:столбец списка рассылки python в несколько столбцов в исходном списке

>>> data[4] 
['', u'BNE JCT TR92 FLO GRJCT-PERRY-BITTERSWEET', u'BNE_JCT TR92 TR92 (XF/ALTW/*)', u'KARMA-PERRY-BITTERSWEET_161', u' 01', -15.88, ''] 
>>> data[5] 
['', u'CRETE-STJHN FLO DMNT-WLTN 765+SPS', u'ST_JOHN 34519 A (LN/NIPS/CE)', u'SPS WILTON-DUMONT+PWRTN 5+JOLIET 7', u' 01', -8.14, ''] 
>>> data[6] 
['', u'HRNR_TR_1_TR_1_XF', u'HRNR TR_1 TR_1 (XF/AMMO/*)', '', u' 01', 1.4, ''] 
>>> data[7] 
['', u'INDPDN INDPDBRYAN69_11 LN', u'INDPDN INDPDBRYAN69_1 1 (LN/ALTW/ALTW)', u'ACTUAL', u' 01', 1.26, ''] 
>>> 

Я хочу разделить столбец 3 в подсписков на 4 компонента следующим образом:

  • Все строки из первого символа до последнего не символ пробела
  • строки, заключенная между ( и /
  • строки, заключенной между / и /
  • Строка, заключенный между / и )

Так что я хочу тот же список, но с колонкой 3 расщепляются на 4 колонки, как описано выше.

Пример:

['', u'BNE JCT TR92 FLO GRJCT-PERRY-BITTERSWEET', u'BNE_JCT TR92 TR92', u'XF',u'ALTW','*', u'KARMA-PERRY-BITTERSWEET_161', u' 01', -15.88, ''] 

Я также не уверен, что u, который предшествует элементам представляет. Я общался с re.split(), но не смог заставить это работать, сохраняя исходный список, но разбивая столбец 3 подписок на 4 дополнительных столбца.

Я ценю помощь.

[Я сделал правку, чтобы удалить ArrayList и заменить его со списком] **

+1

Python не имеет arraylists, только списки, также 'u' на передней панели означает unicode, позволяя строке содержать символы Unicode, используемые в версиях не python 3.0+ (по умолчанию python 3.0+ является unicode). – Serdalis

ответ

2

u на фронте означает Юникод, что позволяет строке содержать Юникод charactors, используемый в не питон 3.0+ версии (питон 3.0+ юникод по умолчанию)

, как для раскола, вы можете сделать следующее разделить на колонны вы желаете:

# search for parts you need in column 3 
for subitem in re.findall("(.*?) \((.*?)\)", item[2]): 
    temp_split = [subitem[0]] 
    temp_split.extend(subitem[1].split("/")) 

вы не можете добавить столбцов в середине списка.
Вы можете создать новый список, как так:

for item_index in range(len(data)): 
    item = data[item_index] 

    for subitem in re.findall("(.*?) \((.*?)\)", item[2]): 
     # part before the () 
     temp_split = [subitem[0]] 
     # part in the () 
     temp_split.extend(subitem[1].split("/")) 

    temp_item = item[:2] 
    temp_item.extend(temp_split) 
    temp_item.extend(item[3:]) 

    data[item_index] = temp_item 
+0

Я немного изменил ваше решение (строка с rstrip()). Иначе это работает. Большое спасибо. – codingknob

+0

@ algotr8der oops sorry неправильно понял ваш первый пункт. – Serdalis

+0

@ algotr8der здесь вы идете, я сделал это правильно для вас. – Serdalis

0
import re 
data = ['', u'BNE JCT TR92 FLO GRJCT-PERRY-BITTERSWEET', u'BNE_JCT TR92 TR92 (XF/ALTW/*)', u'KARMA-PERRY-BITTERSWEET_161', u' 01', -15.88, ''] 
_data =[] 
tempStr = "" 
for i in data: 
    if re.match("(.+/.+/.+)", str(i)): 
     for char in i: 
      if (char != "(" and char != "/" and char != ")"): 
       tempStr += char 
      else: 
       _data.append(tempStr) 
       tempStr = "" 
    else: 
     _data.append(i) 
print _data 

Этот сценарий даст этот вывод:

['', u'BNE JCT TR92 FLO GRJCT-PERRY-BITTERSWEET', u'BNE_JCT TR92 TR92 ', u'XF', u'ALTW', u'*', u'KARMA-PERRY-BITTERSWEET_161', u' 01', -15.88, ''] 
3

Вот регулярное выражение, что будет соответствовать части строки вы хотите :

pattern = r"(.+) \((.+)/(.+)/(.+)\)" 

Это, вероятно, самое простое регулярное выражение, которое будет выполнять работа.

Вот как вы его используете:

import re 

for row in data: 
    row[2:3] = re.match(pattern, row[2]).groups() 

Там много там происходит. Внешний контур довольно прост для понимания.Внутренняя часть состоит из двух частей секций:

  1. re.match(pattern, row[2]).groups() делают регулярные выражения, и возвращает кортеж из значений, которые были найдены (например, ('BNE_JCT TR92 TR92', 'XF', 'ALTW', '*')).
  2. Второй бит - это назначение среза. row[slice] = some_sequence заменяет указанный фрагмент значениями от some_sequence. Если в последовательности есть другое количество значений, чем в срезе, список изменит размер! В этом случае мы заменяем однозначный срез (начиная с индекса 2, останавливаясь перед индексом 3) с четырьмя значениями, полученными нами из регулярного выражения.

Обратите внимание, что этот код вызывает исключение, если регулярное выражение не соответствует значению в любой из ваших строк. Если есть вероятность, что ваши данные будут «грязными», вы должны добавить дополнительную логику, чтобы обнаружить это, а не позволить ему взорваться.

+0

Я попытался запустить свой код, приведенный выше, но получить ... Traceback (самый последний вызов последнего): Файл « », строка 2, в AttributeError: объект «NoneType» не имеет атрибута «группы» – codingknob

+0

@ algotr8der: Да, это исключение, о котором я упоминаю в последнем абзаце. Некоторая строка в ваших «данных» имеет значение, которое не соответствует шаблону. Я не уверен, что вы хотите сделать в этой ситуации, так как это говорит о том, что ваши данные некорректны. Вероятно, есть исправление, но для этого может потребоваться некоторое искажение. Вы можете разделить соответствие и назначение среза, чтобы выяснить, где ошибка. – Blckknght

Смежные вопросы