2011-05-07 6 views
0

에서 읽은 여러 목록에서 반복 찾기 제목이 혼란 스럽지만, 다음 CSV 파일 ('names.csv')로 작업한다고 가정 해 보겠습니다.CSV 파일 (Python)

name1,name2,name3 
    Bob,Jane,Joe 
    Megan,Tom,Jane 
    Jane,Joe,Rob 

제 질문은 최소한 3 번 발생하는 문자열을 반환하는 코드를 만드는 방법입니다. 그래서 결과는 적어도 3 번 발생하기 때문에 'Jane'이어야합니다. 정말 여기에 혼동 .. 아마 일부 샘플 코드는 내가 더 잘 이해하는 데 도움이 될까요?

지금까지 내가 가진 :

import csv 
    reader = csv.DictReader(open("names.csv")) 

    for row in reader: 
     names = [row['name1'], row['name2'], row['name3']] 
     print names 

이 반환 : 여기에서 가야합니까

['Bob', 'Jane', 'Joe'] 
    ['Megan', 'Tom', 'Jane'] 
    ['Jane', 'Joe', 'Rob'] 

? 아니면 내가 잘못 생각할 것인가?

>>> from collections import defaultdict 
>>> d = defaultdict(int) 
>>> rows = [['Bob', 'Jane', 'Joe'], 
... ['Megan', 'Tom', 'Jane'], 
... ['Jane', 'Joe', 'Rob']] 
... 
>>> for row in rows: 
...  for name in row: 
...   d[name] += 1 
... 
>>> filter(lambda x: x[1] >= 3, d.iteritems()) 
[('Jane', 3)] 
: 나는 이런 식으로 할 거라고 .. (물론, 모두 프로그래밍), 그래서 내가 뭘하는지 단서에 가까운이 파이썬에

건배

답변

0

모두를 퍼팅 (적절한 csv.reader 사용을 보여주는) :

import csv 
import collections 
d = collections.defaultdict(int) 
with open("names.csv", "rb") as f: # Python 3.x: use newline="" instead of "rb" 
    reader = csv.reader(f): 
    reader.next() # ignore useless heading row 
    for row in reader: 
     for name in row: 
      name = name.strip() 
      if name: 
       d[name] += 1 
morethan3 = [(name, count) for name, count in d.iteritems() if count >= 3] 
morethan3.sort(key=lambda x: x[1], reverse=True) 
for name, count in morethan3: 
    print name, count 

업데이트를 응답은 언급합니다 :

당신은 당신이 DictReader 사용 여부 파일 전체 CSV를 통해 읽을 필요 접근 여부. 예를 들어 원하는 경우 'name2'열 (행이 아닌)을 무시한 다음 무시하십시오. "행"이라는 변수 이름을 사용하면 모든 데이터를 저장할 필요가 없습니다. 다음은 특정 표제의 열 표제에 의존하지 않고 특정 열의 선택/거부를 ​​허용하는보다 일반적인 접근법을위한 코드입니다.

reader = csv.DictReader(f): 
    required_columns = ['name1', 'name3'] #### adjust this line as needed #### 
    for row in reader: 
     for col in required_columns: 
      name = row[col].strip() 
      if name: 
       d[name] += 1 
+0

고마워요! 이것은 잘 작동하지만 표제 행을 무시했기 때문에 전체 CSV 파일을 읽습니다. CSV 파일의 3 행 중 2 행에서만 특정 이름이 몇 번 나오는지 계산하려면 어떻게해야합니까? ? CSV 파일에는 'name1', 'name2', 'name3'이 포함되어 있지만 'name1'및 'name3'행의 이름 만 계산하므로 'name2'행이 모두 무시됩니다. – New2Python

+0

의미가 많이 있습니다. 나는 마침내 그것을 지금 얻는다. :) 다시 한번 감사드립니다. – New2Python

0

정말 새로운 해요

dict를 기본값 0으로 사용하여 각 이름이 파일에서 몇 번 발생했는지 계산 한 다음 조건 (개수> = 3)에 따라 dict를 필터링합니다.