在python字典中迭代和打印单词

时间:2014-12-13 03:48:18

标签: python dictionary output

我正在学习python的过程中,我喜欢在如此少量的代码中可以完成多少工作,但我对语法感到困惑。我只是试图遍历字典并打印出每个项目和值。

这是我的代码:

words = {}
value = 1

for line in open("test.txt", 'r'):
    for word in line.split():
        print (word)
        try:
            words[word] += 1
        except KeyError:
            #wur you at key?
            print("no")
            words[word]=1

for item in words:
    print ("{",item, ": ", words[item][0], " }")

我当前的打印声明不起作用,我找不到使用多个变量的大型打印语句的好例子。我该如何正确打印?

3 个答案:

答案 0 :(得分:1)

您的问题似乎是您尝试打印words[item][0],但words[item]始终是一个数字,并且无法编号。

所以,只是......不要这样做:

print ("{",item, ": ", words[item], " }")

这足以解决它,但有一些方法可以改进这段代码:

    带有多个参数的
  • print在每个参数之间放置一个空格,因此当您可能不想要所有这些空格时,您将最终打印{ item : 3 }。您可以使用关键字参数sep=''来解决此问题,但更好的解决方案是使用字符串格式或%运算符。
  • 您可以通过迭代words.items()代替words来同时获取密钥和值。
  • 您可以使用setdefault方法或使用defaultdict简化整个“存储默认值(如果尚未存在”),或者更简单地说,您可以使用Counter
  • 您应该始终关闭您打开的文件 - 最好使用with声明。
  • 在你的风格上保持一致 - 不要在某些功能之后放置空格而不是其他功能。

所以:

import collections
with open("test.txt") as f:
    words = collections.Counter(word for line in f for word in line.split())
for item, count in words.items():
    print("{%s: %d}" % (item, count)) 

答案 1 :(得分:0)

你可以使用dict.get并且可以消除try和except块。

words = {}

for line in open("test.txt", 'r'):
    for word in line.split():
        print (word)
        words[word] = words.get(word,0) +1

for word,count in words.items():
    print(word,count)

dict.get它返回密钥,如果存在于字典中,则默认值为
语法:dict.get(key[,default])

你也可以覆盖__missing__

class my_dict(dict):
    def __missing__(self,key):
        return 0


words = my_dict()

for line in open("test.txt", 'r'):
    for word in line.split():
        print (word)
        words[word] += 1

for word,count in words.items():
    print(word,count)

答案 2 :(得分:-1)

在这里迭代字典的最佳方法是按键AND值循环,每次循环时解包键值元组:

for item, count in words.items():
    print("{", item, ": ", count, "}")

作为旁注,在构建数组的循环中,实际上并不需要异常处理逻辑。如果密钥不在字典中,字典'get()方法可以返回默认值,从而将代码简化为:

words[word] = words.get(word, 0) + 1