标题似乎令人困惑,但让我说我正在使用以下CSV文件('names.csv')。
name1,name2,name3
Bob,Jane,Joe
Megan,Tom,Jane
Jane,Joe,Rob
我的问题是,我将如何制作返回至少发生3次字符串的代码。所以输出应该是'Jane',因为它至少发生了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 :(得分: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的dict来计算文件中每个名称发生的次数,然后根据条件过滤dict(count> = 3)。
答案 1 :(得分: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'列( not row ),然后忽略它。您不需要保存所有数据,因为您使用变量名“行”表示。下面是一个更通用的方法的代码,它不依赖于列标题按特定顺序排列,并允许选择/拒绝特定列。
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