2011-05-07 223 views
0

標題似乎令人困惑,但讓我們說我正在處理以下CSV文件('names.csv')。查找從CSV文件讀取的多個列表中的重複(Python)

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

我的問題是,我將如何去做代碼,返回至少出現3次的字符串。所以輸出結果應該是'簡',因爲這至少發生3次。真的很困惑這裏..也許一些示例代碼會幫助我更好地理解?

到目前爲止,我有:

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'] 

我在哪裏何去何從?或者我正在討論這個錯誤?我真的很新的Python的(當然,完全編程),所以我有接近不知道我在做什麼..

乾杯

回答

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 

更新迴應評論:

您需要通過整個CSV讀取文件是否使用DictReader方法與否。如果你想要例如忽略'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 2011-05-07 15:20:33

+0

這使得很多意義。我現在終於明白了。 :) 再次感謝 – New2Python 2011-05-08 00:22:33

0

我會做這樣的:

>>> 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的字典來統計文件中每個名稱的發生次數,然後根據條件(count> = 3)過濾字典。