2014-09-11 2 views
1

부품이 누락 된 문자열을 분할하고 싶습니다. 예 : "foo-bar""foo""bar"으로 분할해야하며 "zot""zot"None으로 분할해야합니다. 하지만 두 번째의 첫 번째 경우에 대한분할 된 데이터 누락을 처리하는 방법은 무엇입니까?

foo,bar = line.split('-',1) 

작품 :

ValueError: need more than 1 value to unpack 

나는, 물론, 먼 길을 갈 수 있습니다

foobar = line.split('-',1) 
if len(foobar) == 2: 
    foo,bar = foobar 
else: 
    foo,bar = foobar[0],None 

을하지만, 이것이 궁금 가장 "파이썬"적인 방법.

+0

다른 많은 옵션이 있습니다 :'시도 : ValueError' 제외하고, '가'- 'line'에 ... 실종 라인이 있습니까 특별하다? – jonrsharpe

+0

당신의'else'는'foo, bar = line, None' 또는'foo, bar = foobar [0], None'이되어야합니다. –

답변

3

캐치 예외 : 당신이 두 값이 아니라 두 번 얻을 수 번 을 분할해야 할 것

try: 
    foo, bar = line.split('-', 1) 
except ValueError: 
    # not enough values 
    foo, bar = line, None 

참고.

2

정확한 예를 들면 partition 방법을 사용합니다. 예외를 잡는 것은 괜찮 바로 것을 여전히 둘 이상의 스플릿하지만 알려진 수있다 일반적인 경우에 대한

>>> 'foo-bar'.partition('-') 
('foo', '-', 'bar') 
>>> 'foobar'.partition('-') 
('foobar', '', '') 
>>> 'foo-bar-baz'.partition('-') 
('foo', '-', 'bar-baz') 

, 나는 보통 split의 결과의 길이를 확인하지만, 마티는 (당연히) 너무과 구분 기호가없는 문자열이 흔하지 않은 경우 더 나은 선택 일 수 있습니다.

+2

그러면'foo, _, bar = ...' – jonrsharpe

+0

다른 언팩이 필요하고 심지어'bar'에'None'을 지정하지 않습니다 :'foo, _, bar = line.partition ('-')'. '없음'문제는 정확히 내가 이것을 사용하지 않은 이유입니다. –

0

사용하여 목록의 이해 :

i=['ff-bb','cc','dd-ss-vv'] 

[string+[None] if len(string)==1 else string for string in [x.split('-') for x in i]] 

반환

[['ff', 'bb'], ['cc', None], ['dd', 'ss', 'vv']] 
관련 문제