2013-05-20 5 views
0

는이 같은 csv 파일을파이썬 3 CSV 데이터 구조 문제

Category Subcategory 
----------------------- 
cat   panther 
cat   tiger 
dog   wolf 
dog   heyena 
cat   lion 
dog   beagle 

임 같은 것을 (하지 않는 것이 중요 순서)를 출력하는 스크립트 작성하려고 :

animals = [ 
       [['cat'], ['panther', 'tiger', 'lion']], 
       [['dog'], ['wolf', 'heyena', 'beagle']] 
      ] 

을 지금까지를 I 고유 한 카테고리의 목록을 만들 수 있으며 고유 한 하위 카테고리의 목록을 만들 수 있습니다.

for p in infile: 
    if(p[0] not in catlist): 
     catlist.append(p[0]) 
    if(p[1] not in subcatlist) : 
     subcatlist.append(p[1]) 

그러나 나는 말한다 논리 쓰는 데 문제가 있어요 '분류'고양이 '동물 []에 있지만,'표범 '이'고양이 '에없는 경우,이를 추가합니다. "

Ive는 zip() 및 dict()로 재생되었지만 Im은 여기에서 꽤 많이 흘러 나오고 있습니다. 새로운 Python을 처음 접했습니다. Python 3 사용.

+0

? 당신은 어떤 결과를 얻었습니까? –

+0

정말 중첩 목록을 원하십니까? Dicts는 더 편안하게 사용할 수 있습니다. –

+0

병이 조금있다. 이제 그 모든 것이 망쳐 버렸다. 저는 기본적으로 2 차원 배열을 다루는 더 좋은 방법을 찾고 있습니다. 또는 이런 종류의 문제에 접근하는 데있어 전반적으로 더 좋은 방법 일 수도 있습니다. – jason

답변

4

키를 일부 값에 매핑하려면 사전을 사용하는 것이 훨씬 쉽습니다. 특히 건물에 편리하면 defaultdict입니다.

당신의 INFILE이 빈의 입력 라인을 분할 가정하면, 다음은 도움이 될 것입니다

from collections import defaultdict 

animals = defaultdict(list) 

for p in infile: 
    animals[p[0]].append(p[1]) 
+0

이것이 정확히 필요한 것 같습니다. 감사합니다. – jason

+1

'p [0]'/'p [1]'을 색인하기보다는, 언팩을 사용하고 infile에서 key, value를 사용하는 것이 더 좋습니다 :'animals [key] .append (value)' . –

2

당신은 세트와 딕셔너리를 사용하는 것이 좋습니다. 범주 이름을 사전의 키로 사용하십시오. 따라서 모든 p in infile, animals[p[0]].add(p[1])에 대해 p0, p1이 유형 및 종이라고 가정합니다.

'Panther'가 'Cat'으로 여러 번 나타나는 경우, 'Cat'목록에 이미 있는지 확인하지 않아도됩니다. 세트 유형을 사용하면 고유 한 요소 집합입니다. 목록의 사용에 비해

>>> from collections import defaultdict 
>>> animals = defaultdict(set) 
>>> animals['Cat'].add('Panther') 
>>> animals 
defaultdict(<class 'set'>, {'Cat': {'Panther'}}) 
>>> animals['Cat'].add('Lion') 
>>> animals 
defaultdict(<class 'set'>, {'Cat': {'Lion', 'Panther'}}) 
>>> animals['Cat'].add('Panther') 
>>> animals 
defaultdict(<class 'set'>, {'Cat': {'Lion', 'Panther'}}) 

:

코드의 나머지 부분입니다
>>> moreanimals = defaultdict(list) 
>>> moreanimals['Cat'].append('Panther') 
>>> moreanimals 
defaultdict(<class 'list'>, {'Cat': ['Panther']}) 
>>> moreanimals['Cat'].append('Panther') 
>>> moreanimals 
defaultdict(<class 'list'>, {'Cat': ['Panther', 'Panther']}) 
+0

값 요소의 고유성 측면에 +1 – msw

관련 문제