2013-03-18 3 views
1

자체 목록 인 많은 항목을 포함하는 목록이 있습니다. 다음은 주요 목록 내에서 하위 목록의 일부는 다음과 같이 내가 네 구성 요소에 하위 목록에서 열 세를 분할 할파이썬 분할 목록 열을 원래 목록의 여러 열로 바꿉니다.

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

:

  • 마지막으로 첫 번째 문자에서 문자열의 모든 비 공백 문자
  • 이 문자열은 (/
  • //
  • 0,123,516 사이에 캡슐화 된 문자열 사이에 캡슐화
  • 문자열 그래서 동일한 목록을 원하는

/ 사이 ) 캡슐화하지만 4 열로 분할 칼럼 (3) 전술 한 바와 같이.

예 :

['', 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 개의 추가 열로 나눠서 사용할 수는 없습니다.

감사합니다.

문자열이 아닌 파이썬 3.0 이상 버전에서 사용 유니 코드 charactors를 포함 할 수 있도록 유니 코드를 의미 전면에

+1

파이썬에는 arraylists, 그냥 목록이 없습니다. 또한 앞에있는'u'는 유니 코드를 나타냅니다. 파이썬 3.0+ 버전 (파이썬 3.0+는 기본적으로 유니 코드)에서 사용되는 유니 코드 문자를 포함하는 문자열을 허용합니다. – Serdalis

답변

2

u를 ** [내가 ArrayList를 제거하고리스트로 대체 편집했다 (파이썬 기본적으로 유니 코드) 당신의 분할에 대한 같은

입니다 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 죄송합니다. 첫 번째 글 머리 기호를 잘못 이해했습니다. – Serdalis

+0

@ algotr8der 여기 있군, 내가 너에게 옳았다. AttributeError에서, 파일 "", 라인 2 : – 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의 값으로 바꿉니다. 시퀀스에있는 값과 슬라이스에있는 값의 수가 다른 경우 목록의 크기가 변경됩니다! 이 경우 정규 표현식에서 얻은 4 개의 값으로 단일 값 슬라이스 (인덱스 2에서 시작하여 인덱스 3 이전에 중지)를 대체합니다.

정규 표현식이 어떤 행의 값과도 일치하지 않으면이 코드는 예외를 발생시킵니다. 데이터가 "엉망"이 될 가능성이있는 경우,이를 파열시키는 대신 감지하기위한 추가 로직을 추가해야합니다.

+0

나는 ... 역 추적 (가장 최근 통화 마지막)을 위의 코드를 실행되지만 얻기 위해 노력했다 'NoneType'개체가 algotr8der @ 더 속성 '그룹' – codingknob

+0

이 없습니다 : 네, 마지막 단락에서 언급 한 예외입니다. '데이터'의 일부 행에 패턴과 일치하지 않는 값이 있습니다. 나는 그 상황에서 당신이하고 싶은 것이 확실하지 않습니다, 왜냐하면 그것은 당신의 데이터가 어떤면에서는 부패했다고 제안하기 때문입니다. 아마도 수정 사항이있을 수 있지만 찾으려면 약간의 손길이 필요할 수 있습니다. 일치하는 부분과 분할 된 부분을 분리하여 오류의 위치를 ​​파악할 수 있습니다. – Blckknght

관련 문제