如何从我在Python的第二个函数中的第一个函数调用字典

时间:2016-08-27 19:52:21

标签: python dictionary

我是Python的新手,为了帮助新学习,我正在构建一个程序,我希望将其分解为两个步骤:

步骤1)计算文本文件中特定单词的数量,将其存储在字典中,其中键,值对为{word,count}

步骤2)从(1)开始按降序排序字典,以显示前100个单词

第1步工作正常,但在尝试第2步时,我很难从第一个函数调用字典。我创建了一个新变量'tallies',但这是一个元组,只显示字典中的第一个条目。

如何将完整字典调用到我的第二个功能?

感谢。

filename = 'nameoffile.txt'

def tally():
  file = open(filename,'r')
  wordcount={}
  for word in file.read().split():
    if word not in wordcount:
      wordcount[word] = 1
    else:
      wordcount[word] += 1
  for k,v in wordcount.items():
    return k,v

def Count():
  tallies = tally()
  print tallies

Count()

3 个答案:

答案 0 :(得分:1)

你的理货函数正在返回它看到的第一个项目; return只能返回一次,但您在循环中调用它。尝试返回整个wordcount dict:

filename = 'nameoffile.txt'

def tally():
  file = open(filename,'r')
  wordcount={}
  for word in file.read().split():
    if word not in wordcount:
      wordcount[word] = 1
    else:
      wordcount[word] += 1
  return wordcount

def Count():
  tallies = tally()
  sorted_tallies = sorted(tallies.items(), key=operator.itemgetter(1))
  print sorted_tallies[:100]

Count()

在python中dict本质上是无序的,因此为了对它进行排序,您需要将其元组排序到列表中。 sorted代码执行此操作(see this reference)。

祝你好运!

答案 1 :(得分:0)

这些任务正是collections.Counter()的用途。您可以使用此函数来创建包含单词及其频率的计数字典对象,您可以在分割文本上调用它。然后使用Counter.most_common(N)获取大多数N个常用项目。

关于以下部分的代码:

for k,v in wordcount.items():
    return k,v

在第一次迭代之后,您将通过return打破循环,它只会返回第一个项目。

您只需返回字典:

def tally():
    file = open(filename,'r')
    wordcount={}
    for word in file.read().split():
        if word not in wordcount:
            wordcount[word] = 1
        else:
            wordcount[word] += 1
    return wordcount

您甚至可以使用collections.defaultdict()手动创建计数器对象。使用此函数的好处是它覆盖了一个方法并添加了一个可写的实例变量。

from collections import defaultdict

wordcount = defaultdict(int) # default is 0

def tally():
    with open(filename) as f 
    for word in f.read().split():
            wordcount[word] += 1
    return wordcount

为了返回已排序的项目,您可以通过将键函数传递给字典项目来使用sorted()函数,以便按第二项对项目进行排序。例如:

sorted(wordcount.items(), key=lambda x:x[1])

但正如我所说的那样,pythonic和优化方法正在使用collections. Counter()

from collections import Counter

with open(filename) as f:
    wordcount = Counter(f.read().split())

top100 = wordcount.most_common(100)

答案 2 :(得分:0)

您的问题是您在第一次迭代后返回O(N),这意味着您只抓住了第一项。以下代码修复了此问题。我还添加了反转功能。

k,v