字典与词长度的出现

时间:2016-12-06 22:05:32

标签: python dictionary

我的函数将字典作为输入,然后在控制台中显示文本条形图。也就是说,它应该" print"到屏幕上的条形图。字符串的标签是字典中的键,条形长度由键的值决定。

例如使用这个字典:

{4:2, 3:5, 10:1, 8:1, 5:1}

情节看起来像这样:

keys|values         
----+-------------       
03|#####       
04|##   
05|#  
08|#  
10|#

制作绘图时,标签(键)应按排序顺序显示。每个标签(键)应以前导零显示,以使每个标签具有相同的位数。目前我所有的功能都是打印一个包含以下句子的文件的字典:

  

然后最后的作业结束了,每个人都很伤心

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

def main():

    d = wordLengthStats("sample.txt")
    print("d should be { 3:5, 4:2, 5:1, 8:1, 10:1} ")
    print("d is", d)

if __name__ == '__main__':
    main()

句子只是一个例子,我试图让任何输入都能正常工作。任何有关解决此问题的帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用列表推导为字典项中的键,值创建元组(键,值*“#”)并对此列表进行排序:

d = { 4:2, 3:5, 10:1, 8:1, 5:1}
sorted([(k,'#'*v) for k, v in d.items()])

您可以通过迭代列表中的这些元组来获得所需的输出,并使用以下打印格式:

for x in sorted([(k,'#'*v) for k, v in d.items()]):
    print "{}|{}".format(x[0], x[1])

将“0”添加到k< 10:

if x[0] < 10:
    print "0{}|{}".format(x[0], x[1])
else: 
    print "{}|{}".format(x[0], x[1])

答案 1 :(得分:0)

试试这个:

from collections import Counter

def wordLengthStats(filename):
    counts=Counter(i.strip() for i in open(filename).readlines())
    for (k,v) in sorted(counts.items(),key=lambda x: x[-1],reverse=True):
        print("{}|{}".format(k.zfill(2),'#'*v))

Counter函数将创建一个字典,其频率为filename中的所有行。

sorted(counts.items(),key=lambda x: x[-1],reverse=True)表示根据reverse=True中的最后一个位置x[-1]按降序排列(counts.items())项目,这将是频率。

最后,.zfill字符串方法用k语句填充print前导零。

示例:

假文件'fake.txt':

  

3
  3
  3
  3
  3
  4
  4
  5
  8
  10个

>>> wordLengthStats('fake.txt')
03|#####
04|##
05|#
08|#
10|#

在这种情况下counts看起来像:

{'3': 5, '4': 2, '5': 1, '8': 1, '10': 1}

sorted(counts.items(),key=lambda x: x[-1],reverse=True)看起来像(注意最常见的项目是第一个):

[('3', 5), ('4', 2), ('5', 1), ('8', 1), ('10', 1)]

如果您不想按频率排序,而是按键排序,请执行sorted(counts.items())