2017-04-11 1 views
-2

일부 데이터에서 특정 요소의 색인을 가져 오려고합니다. 나는 'b'와 'c'의 모든 인스턴스를 찾고 'position_b'와 'position_c'에 인덱스를 넣고 싶습니다. 여기에 내가 작성한 코드와 함께 오류가 점점 오전 : 위의 몇 줄의 b 또는 c가 없습니다 데이터에 나타낸 바와 같이Python AttributeError : 'list'객체에 'startswith'속성이 없습니다.

data = [['a', 'b', 'c'], ['a', 'a', 'a'], ['b', 'c', 'c'], ['d', 'b', 'f'], ['g', 'c', 'i']] 

position_b, position_c = [], [] 
for line in data: 
    if data.startswith("b"): 
    position_b.append(line.index("b")) 
    elif data.startswith("c"): 
    position_c.append(line.index("c")) 

, 일부 라인은 모두이있을 것이다.

처음에는 'index'만 시도했지만 일부 목록에는 'b'또는 'c'가 없으므로 'substring not found'오류가 발생했습니다. 그럼 대답은 here에서 'startswith'를 시도했는데 'AttributeError :'list '객체에'startswith '속성이 없습니다.'이제 startswith가 목록 객체에서 작동하지 않는다는 것을 알게되었습니다. 내 목록에서 'b'또는 'c'를 찾아 색인을 생성하기 위해 대신 무엇을 사용할 수 있습니까?

원하는 출력은 : 당신이 startswith을 사용할 것으로 예상 있지만 목록 에 관계없이, 그 위치를 특정 항목을 포함하는 경우 당신은 그냥 알고 싶어처럼

position_b = [1, 0, 1] 
position_c = [2, 1, 2, 1] 
+0

목록이 startswith 방법이 없습니다 . 이 질문에 대해서는 설명서를 참조하십시오. – Carcigenicate

+3

코드에서 오류를 재현하는 데 필요한 모든 것을 제거하십시오. line.split()은'[ 'a', 'b', 'c'] [ 'd', 'b', 'f'] [ 'g', 'c', ' i ']'(어쨌든 문자열입니까?) 정확한 정보를 제공해주십시오. 간단히 말해서 (gzip, sys 및 수정하려고하는 예외와 관련없는 모든 것) [mcve]를 제공하십시오. – MSeifert

+0

데이터는 문자열 목록 또는 목록 목록과 같습니다 : 예 :'data = [[ 'a', 'b', 'c'], [ 'a', 'a', 'a']]'? –

답변

0

: 나는 data 변수가이 방법으로 같은 목록의 목록입니다 가정

을 :

: 그래서

data = [['a', 'b', 'c'], ['a', 'a', 'a'], ['b', 'c', 'c'], ['d', 'b', 'f'], ['g', 'c', 'i']] 

, 당신은이 작업을 수행 할 수 있습니다

position_b = [(k,i) for k,v in enumerate(data) for i,j in enumerate(v) if j == 'b'] 
position_c = [(k,i) for k,v in enumerate(data) for i,j in enumerate(v) if j == 'c'] 

print("position_b:", position_b) 
print("position_c:", position_c) 

출력 :

# position: 0, 1 
#    v v 
position_b: [(0, 1), (2, 0), (3, 1)] 
position_c: [(0, 2), (2, 1), (2, 2), (4, 1)] 

편집 :

전체 list comprehension 구문 만 for loopsenumerate를 사용하여이 방법처럼 쓸 수

:

position_b, position_c = [], [] 
for k,v in enumerate(data): 
    for i,j in enumerate(v): 
     if j == 'b': 
      position_b.append((k,i)) 
     if j == 'c': 
      position_c.append((k,i)) 

print(position_b) 
print(position_c) 

출력 :

[(0, 1), (2, 0), (3, 1)] 
[(0, 2), (2, 1), (2, 2), (4, 1)] 
+0

나는 그 목록을 이해하는 데 어려움을 겪고있다. 조금씩 깨뜨릴 수 있기 때문에 나는 무슨 일이 일어나는지 더 잘 이해할 수 있을까? 조각으로 나누려고 할 때 j == 'b' "라인에 '잘못된 구문'이 표시됩니다. 그래도 도움이 돼서 고마워! – Liquidity

+0

지금 확인하십시오. 내 대답이 업데이트되었습니다. –

0

것 같습니다. 따라서 in 키워드 만 사용할 수 있습니다.

if "b" in data: 
    position_b.append(line.index("b")) 

또는 :이 도움이

try: 
    index = line.index("b") 
except ValueError: 
    # line doesn't contain "b" 
    pass 
else: 
    position_b.append(index) 

희망!

이 방법처럼 작업을 달성하기 위해 list comprehension을 사용할 수 있습니다
+0

처음에 position_b = []을 추가하고 끝에 position_b를 인쇄하여 첫 번째 옵션을 시도하면 print 문은 [1, 0, 1] 대신에 빈칸 []을 제공합니다. 두 번째 옵션은 목록에서 [b, b, b]와 같은 목록을 [0, 1, 2]로 제공하고자하는 목록에서 "b"의 첫 번째 인스턴스에 대한 색인 만 제공합니다. ]. – Liquidity

관련 문제