Python字典:保持整数计数

3

我正在尝试计算一组整数。我有一个包含数字的csv文件,我可以读取它,看起来像这样4,245,34,99,340,...

我的目标是返回一个字典,其中键值对的键是csv文件中的整数值,而值是它在列表中出现的次数。我不确定我在做什么错误,请帮忙解决。

allCounts = dict()

rows = csv.reader(open('...csv'), delimiter=',')

    for intValue in rows:
        intVal = intValue[0]

        for intVal, numAppearances in allCounts:
             if intVal in allCounts:
                allCounts[numAppearances] = allCounts[numAppearances]+1
             else:
                allCounts[numAppearances] = 1

这是作业吗?另外,您的预期输出值是什么?您想要每行CSV文件的字典,然后呢...? - chryss
不,这不是作业。我正在进行一个研究项目,并在学习Python的过程中。 - student
3个回答

8

5
你正在为每个单元格循环整个字典,这有点奇怪,也可能不是你想要的。你真正想做的是只查找目标键并增加其值。所以:
# first part stays mostly the same
rows = csv.reader(open("...csv") )

allCounts = {} 

for row in rows:
    for field in row:
        allCounts[field] = allCounts.get(field, 0) + 1

最后一行使用了dict的一个很好的特性,如果未找到键,则返回默认值。

在您自己的代码中,存在一些值得注意的缺陷。最重要的是第四和第五行。您从所选行中提取第一个字段并将其分配给intVal,但然后您完全使用它作为遍历字典时的键掩盖了intVal。这意味着该赋值根本没有起作用。

if子句注定会失败。您正在检查一个键是否在字典中,但是您通过迭代来自同一字典的键来想出该键。当然,该键在字典中。

下一个问题是您的else子句正在修改您正在迭代的集合。Python不对此在字典方面的工作方式做出任何保证,因此不要这样做

实际上,没有必要遍历字典。您可以直接获取您感兴趣的任何键值对。您应该遍历的是文件中的整数列表。

CSV文件始终结构化为由逗号(通常)分隔的值列表,这些值形成行,并且行由换行符分隔。 CSV模块保留了这个视图,通过返回一个列表的列表。要深入到实际值,您需要遍历每行,然后遍历该行中的每个字段。您的代码遍历每一行,然后遍历每个行的字典键,忽略了字段。


你可能想要使用defaultdict,它看起来稍微简单一些。 - S.Lott
@S.Lott:没错,但是那样我就得引入一个新的集合,只要方便的话,我宁愿保持使用的模块数量较少。 - SingleNegationElimination
1
无法购买那个非常明智。这是Python。几乎所有的事情都涉及广泛使用库。我认为提供dict.get(this,0)是误导性的,因为有一个稍微简单的方法可用。特别是因为额外的信息可能会帮助这个人更好地理解Python如何解决这类问题。 - S.Lott
1
就此而言,对于这个特定的用例,collections.Counter可能比collections.defaultdict简单一点。 - Marius Gedminas

0

摆脱 intVal = intValue[0]

由于intValue是一个字符串,所以你将得到这个数字的字符串表示中的第一个字符。实际上你想要的是 intValue = int(intValue)

然后你的逻辑全错了 - 目前 allCounts 被初始化为一个无法迭代的空字典。你想做的是迭代csv.reader返回的值,而你已经在那里了。从那里开始你的逻辑很接近 - 不幸的是这既不是手榴弹也不是马蹄铁。你想要的是这个:

# Checks to see if intValue is a key in the dictionary
if intValue in allCounts:
    # If it is then we want to increment the current value
    # += 1 is the idiomatic way to do this
    allCounts[intValue] += 1
else:
    # If it is not a key, then make it a key with a value of 1
    allCounts[intValue] = 1

在他的代码中,intValue 不是整数。实际上,它是由 csv.reader.next 返回的字符串列表。 - SingleNegationElimination
啊...問題解決了。當你花太多時間看 IPython 提示時,那些單引號就會消失! - Wayne Werner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接