Python 在字典中递增

Python 在字典中递增,python,duplicates,Python,Duplicates,我已经看到了一堆基本上做了我正在做的事情的帖子,但不幸的是,我不知道为什么我一直得到的输出不是我想要的。问题是,每当某个单词出现在我的excel文件中时,我都试图增加一个字典,但单词的每个实例都被视为一个新词,就像我当前的代码一样。例如,在我的文件中发生了约50次,但输出只是列出了许多不同行上的,每个实例的计数为1。事实上,我只想列出一次,计数50。如有任何澄清,将不胜感激!这是我的密码: import csv import string filename = "input.csv" outp

我已经看到了一堆基本上做了我正在做的事情的帖子,但不幸的是,我不知道为什么我一直得到的输出不是我想要的。问题是,每当某个单词出现在我的excel文件中时,我都试图增加一个字典,但单词的每个实例都被视为一个新词,就像我当前的代码一样。例如,在我的文件中发生了约50次,但输出只是列出了许多不同行上的,每个实例的计数为1。事实上,我只想列出一次,计数50。如有任何澄清,将不胜感激!这是我的密码:

import csv
import string

filename = "input.csv"
output = "output1.txt"

def add_word(counts, word):
    word = word.lower()
    #the problem is here, the following line never runs
    if counts.has_key(word):
        counts[word] +=1
    #instead, we always go to the else statement...
    else:
        counts[word] = 1
    return counts

def count_words(text):
    word = text.lower()
    counts = {}
    add_word(counts, word)
    return counts

def main():
    infile = open(filename, "r")
    input_fields = ('name', 'country')
    reader = csv.DictReader(infile, fieldnames = input_fields)
    next(reader)
    first_row = next(reader)
    outfile = open(output, "w")
    outfile.write("%-18s%s\n" %("Word", "Count"))
    for next_row in reader:
        full_name = first_row['name']
        word = text.split(' ',1)[0]
        counts = count_words(word)
        counts_list = counts.items()
        counts_list.sort()
        for word in counts_list:
            outfile.write("%-18s%d\n" %(word[0], word[1]))
        first_row = next_row

if __name__=="__main__":
main()
您的函数count_words每次调用时都会创建一个新字典,而不仅仅是添加到当前结果字典中

但是,对于这样的事情,您可能需要考虑在集合模块中使用一个特殊的DICT计数器:

您的函数count_words每次调用时都会创建一个新字典,而不仅仅是添加到当前结果字典中

但是,对于这样的事情,您可能需要考虑在集合模块中使用一个特殊的DICT计数器:


使用普通字典,dict.get方法非常适合计数:

>>> d = {}
>>> for color in 'red green blue green red red green'.split():
        d[color] = d.get(color, 0) + 1

>>> d
{'blue': 1, 'green': 3, 'red': 3}
提供了两种简化此代码的方法

这里有一个

还有一种方法:

>>> from collections import defaultdict
>>> d = defaultdict(int)
>>> for color in 'red green blue green red red green'.split():
        d[color] += 1

>>> d
defaultdict(<type 'int'>, {'blue': 1, 'green': 3, 'red': 3})
当您的输出需要是一个常规字典或使用较旧版本的Python时,常规字典方法最合适

计数器方法易于使用,并且有许多非常适合计数应用的实用程序。例如,最常用的方法按排序顺序列出n个最大计数。A适用于2.7之前的Python版本


defaultdict方法有一些缺点。仅仅访问缺少的值就会导致字典增长。此外,要使用它,您需要了解工厂函数,并且知道可以在不带参数的情况下调用int来生成零值。

使用普通字典,dict.get方法非常适合计算:

>>> d = {}
>>> for color in 'red green blue green red red green'.split():
        d[color] = d.get(color, 0) + 1

>>> d
{'blue': 1, 'green': 3, 'red': 3}
提供了两种简化此代码的方法

这里有一个

还有一种方法:

>>> from collections import defaultdict
>>> d = defaultdict(int)
>>> for color in 'red green blue green red red green'.split():
        d[color] += 1

>>> d
defaultdict(<type 'int'>, {'blue': 1, 'green': 3, 'red': 3})
当您的输出需要是一个常规字典或使用较旧版本的Python时,常规字典方法最合适

计数器方法易于使用,并且有许多非常适合计数应用的实用程序。例如,最常用的方法按排序顺序列出n个最大计数。A适用于2.7之前的Python版本


defaultdict方法有一些缺点。仅仅访问缺少的值就会导致字典增长。此外,要使用它,您需要了解工厂函数,并且知道可以在不带参数的情况下调用int来生成零值。

计数器示例可以简化为:d=计数器“红-绿-蓝-布林-红-红-绿”。当您教人们如何使用计数器时,这不是您教的第一件事。从c[k]+=1开始,然后逐步提高。还应该提到的是,计数器仅适用于Python 2.7++@RaymondHettinger-我总是发现Python文档非常混乱。从c[k]+=1开始实际上根本无法区分计数器和defaultdict。事实上,很长一段时间我错误地想,为什么我需要柜台?这只是一个默认命令…@RaymondHettinger,谢谢你的帮助!我发现常规字典法是目前最简单的方法,但当我了解更多信息时,我会回到本页,以便更好地理解其他方法。再次感谢!反例可以简化为:d=计数器“红-绿-蓝-布林-红-红-绿”。当你教人们如何使用计数器时,这不是你教的第一件事。从c[k]+=1开始,然后逐步提高。还应该提到的是,计数器仅适用于Python 2.7++@RaymondHettinger-我总是发现Python文档非常混乱。从c[k]+=1开始实际上根本无法区分计数器和defaultdict。事实上,很长一段时间我错误地想,为什么我需要柜台?这只是一个默认命令…@RaymondHettinger,谢谢你的帮助!我发现常规字典法是目前最简单的方法,但当我了解更多信息时,我会回到本页,以便更好地理解其他方法。再次感谢@user1590499-查看我使用计数器进行的编辑。希望这足以让你达到你想要的目的……对于那些非常喜欢一行的人来说:c=Countertext.lower代表csv中的行,而U reader代表rowHa中的文本!我说得太过分了。然而,我会写这样一行,假设它被指定了像word_count这样的名字。我会写一行用于打开文件,另一行用于创建csv读取器,然后最后一行word_count=Counters.lower用于读取器中的行,用于第行中的s。@user1590499-请参阅我使用计数器进行的编辑。希望这将足以让你
你想去哪里就去哪里……对于那些非常喜欢一行的人来说:c=Countertext.lower代表csv中的行,而U reader代表rowHa中的文本!我说得太过分了。然而,我会写这样一行,假设它被指定了像word_count这样的名字。我将写一行用于打开文件,另一行用于创建csv读取器,然后最后一行word_count=Counters.lower表示行中读取器中的行,表示行中的s。