这是我的第一个 python 程序 -
需求:读取一个文件,每行包含{adId UserId}。对于每个 adId,打印唯一 userId 的数量。
这是我的代码,通过阅读 python 文档整理而成。您能否就如何以更像 Python 的方式编写此内容提供反馈?
代码:
import csv
adDict = {}
reader = csv.reader(open("some.csv"), delimiter=' ')
for row in reader:
adId = row[0]
userId = row[1]
if ( adId in adDict ):
adDict[adId].add(userId)
else:
adDict[adId] = set(userId)
for key, value in adDict.items():
print (key, ',' , len(value))
谢谢。
最佳答案
恭喜,你的代码非常好。 您可以使用一些小技巧来使其更短/更简单。
集合模块提供了一个名为 defaultdict 的漂亮对象类型。不必检查 adDict 是否有 adId 键,您可以设置一个 defaultdict,它的作用类似于常规字典,只是它会在没有键时自动为您提供一个空的 set()。所以你可以改变
if ( adId in adDict ):
adDict[adId].add(userId)
else:
adDict[adId] = set(userId)
简单地
adDict[adId].add(userId)
另外,代替
for row in reader:
adId = row[0]
userId = row[1]
你可以将其缩短为
for adId,userId in reader:
编辑正如帕克在评论中亲切指出的那样,
for key, value in adDict.iteritems():
是迭代字典的最有效方法,如果你打算同时使用两者 循环中的键和值。在Python3中,你可以使用
for key, value in adDict.items():
因为 items() 返回一个迭代器。
#!/usr/bin/env python
import csv
from collections import defaultdict
adDict = defaultdict(set)
reader = csv.reader(open("some.csv"), delimiter=' ')
for adId,userId in reader:
adDict[adId].add(userId)
for key,value in adDict.iteritems():
print (key, ',' , len(value))
关于dictionary - 有没有更好的 pythonic 方法来做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1597764/