我的函数将字典作为输入,然后在控制台中显示文本条形图。也就是说,它应该" 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()
句子只是一个例子,我试图让任何输入都能正常工作。任何有关解决此问题的帮助将不胜感激。谢谢!
答案 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())