2011-10-25 2 views
2

2D 목록에서 행과 열을 뒤집어보고 문제가 발생했습니다. 파이썬은 초기화되지 않은 '셀'에 값을 할당 할 수 없습니다. 나는 미리 길이를 모르기 때문에 그리드를 초기화하는 방법을 모르겠습니다. 다음 : "범위를 벗어 목록 할당 인덱스 IndexError"오류를행/열 길이를 알 수없는 파이썬에서 2D 목록에 추가하기

data = list() 
maReader = csv.reader(open('TEST.csv', 'rb'), delimiter=',', quotechar='"') 
for rindex, row in enumerate(maReader): 
    for iindex, item in enumerate(row): 
     data[iindex][rindex] = item 

은 실패합니다. 루프와 값을 할당하는 것보다 그리드를 초기화하는 것보다 열과 행을 처음으로 두 번 반복 할 수는 있지만 너무 낭비가됩니다.

나는 파이썬에 매우 익숙하며, 이것을 놓칠 수있는 간단한 방법이있다.

도움 주셔서 감사합니다. 동일한 길이의 모든 행을 가정

답변

3

여기 @ retracile의 LBYL 접근 방식에 EAFP 대위법이다.

data = [] #list() 
maReader = csv.reader(open('TEST.csv', 'rb'), delimiter=',', quotechar='"') 
for rindex, row in enumerate(maReader): 
    for iindex, item in enumerate(row): 
     try: 
      data[iindex].append(item) 
     except IndexError: 
      data.append([item]) 
+0

첫 번째 행이 유일한 예외이므로이 방법은 아마도 내 것보다 빠릅니다. – retracile

+0

완벽합니다. 고맙습니다! – user1013550

2

, 당신은 이런 식으로 접근 할 수

data = list() 
maReader = csv.reader(open('TEST.csv', 'rb'), delimiter=',', quotechar='"') 
for rindex, row in enumerate(maReader): 
    for iindex, item in enumerate(row): 
     if len(data) <= iindex: 
      data.append([]) 
     data[iindex].append(item) 
2

이 수행해야합니다

maReader = csv.reader(open('TEST.csv', 'rb'), delimiter=',', quotechar='"') 
data = zip(*maReader) 

비록, zip는 튜플의 목록을 제공합니다. 당신이 목록의 목록을해야 할 경우 다음 중 하나를 수행 할 수

data = [list(x) for x in zip(*maReader)] 
data = map(list, zip(*maReader)) 
+0

더 나은 방법이 있었지만 내 뇌가 작동하지 않았습니다. +1 – retracile

1

길이가 같은 모든 행이 data = zip(*maReader)이면 그렇게해야합니다. 그렇지 않은 경우 :

from itertools import izip_longest 

list(izip_longest(*f, fillvalue='')) 

Matrix Transpose in Python를 참조하십시오.

관련 문제