dictionary - 有没有更好的 pythonic 方法来做到这一点?

标签 dictionary set python

这是我的第一个 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/

相关文章:

C++:搜索 std::set 指向类的指针

python 词分解为子词 : e. g。 motorbike -> 马达,自行车

python - django-registration 无法为身份验证电子邮件设置 "from"电子邮件地址

python - 存储字典值的路径

c - 帕斯卡 - 集合如何工作?

python - python中迭代下的字典问题

python - 确定多组整数的交集是否非空的最快方法是什么?

python - QtiPlot 和 Python : global name 'QLocale' is not defined

javascript - 字典仅包含单个元素

java - 多次调用 hazelcast 中的 Load All