Python 按字母顺序对词典排序,并按频率打印
我正在mac上运行python 2.7.2 我有一本简单的字典:Python 按字母顺序对词典排序,并按频率打印,python,dictionary,tabular,alphabetical,Python,Dictionary,Tabular,Alphabetical,我正在mac上运行python 2.7.2 我有一本简单的字典: dictionary= {a,b,c,a,a,b,b,b,b,c,a,w,w,p,r} 我希望它能被打印出来,并有如下输出: Dictionary in alphabetical order: a 4 b 5 c 2 p 1 r 1 w 2 但我得到的是这样的东西 a 1 a 1 a 1 a 1 b 1 . . . w 1 这是我正在使用的代码 new_
dictionary= {a,b,c,a,a,b,b,b,b,c,a,w,w,p,r}
我希望它能被打印出来,并有如下输出:
Dictionary in alphabetical order:
a 4
b 5
c 2
p 1
r 1
w 2
但我得到的是这样的东西
a 1
a 1
a 1
a 1
b 1
.
.
.
w 1
这是我正在使用的代码
new_dict = []
for word in dictionary.keys():
value = dictionary[word]
string_val = str(value)
new_dict.append(word + ": " + string_val)
sorted_dictionary = sorted(new_dict)
for entry in sorted_dictionary:
print entry
你能告诉我哪里错了吗?
(顺便说一句,我不是程序员,而是语言学家,所以请对我放轻松。)让我们从显而易见的事情开始,这是:
dictionary= {a,b,c,a,a,b,b,b,b,c,a,w,w,p,r}
这不是一本字典。它是一个集合
,并且集合
不保留重复项。您可能打算将其声明为列表
或元组
现在,谈谈问题的实质:您需要实现一些东西来计算集合中的项目。您的实现并没有真正做到这一点。您可以自己滚动,但实际上您应该使用计数器
:
my_list = ['a','b','c','a','a','b','b','b','b','c','a','w','w','p','r']
from collections import Counter
c = Counter(my_list)
c
Out[19]: Counter({'b': 5, 'a': 4, 'c': 2, 'w': 2, 'p': 1, 'r': 1})
现在转到下一个问题:字典(所有类型,包括Counter
对象)不保留键顺序。您需要调用dict的items()
(元组列表)上的sorted
,然后对其进行迭代以进行打印
for k,v in sorted(c.items()):
print('{}: {}'.format(k,v))
a: 4
b: 5
c: 2
p: 1
r: 1
w: 2
你用的不是字典,而是一本!:) 而且集合不允许重复 你可能需要的不是字典,而是列表 稍作解释 字典有键,每个唯一键都有自己的值:
my_dict = {1:'a', 2:'b', 3:'c'}
您可以使用以下键检索值:
>>> my_dict [1]
'a'
另一方面,列表没有键
my_list = ['a','b','c']
然后使用它们的索引检索值:
>>> my_list[1]
'b'
请记住,索引从零开始计数,而不是从1开始
解决问题
现在,为了你的问题。首先,将字符存储为列表:
l = ['a', 'b', 'c', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'a', 'w', 'w', 'p', 'r']
接下来,我们需要知道此列表中的项目:
items = []
for item in l:
if item not in items:
items.append(item)
这相当于items=set(l)
(唯一的区别是这是一个列表)。但为了让事情变得清楚,希望您理解代码的作用
以下是项目的内容
:
>>> items
['a', 'b', 'c', 'w', 'p', 'r']
完成后,我们将使用方法查看列表中出现的字符数,并使用内置函数对项目进行排序:
for item in sorted(items): #iterates through the sorted items.
print item, l.count(item)
结果:
a 4
b 5
c 2
w 2
p 1
r 1
希望这有帮助 字典是这样的
{key1:content1,key2:content2,…}
字典中的键是唯一的。然后a={1,2,3,4,5,5,4,5,6}
是集合,当你打印出来时,你会注意到
print a
set([1,2,3,4,5,6])
消除重复项
在您的情况下,可以使用的更好的数据结构是一个列表,其中可以包含多个副本
如果要计算内部的元素编号,更好的选项是,例如:
import collections as c
cnt = c.Counter()
dict= ['a','b','c','a','a','b','b','b','b','c','a','w','w','p','r']
for item in dict:
cnt[item]+=1
print cnt
结果将是:
Counter({'b': 5, 'a': 4, 'c': 2, 'w': 2, 'p': 1, 'r': 1})
正如您所注意到的,结果在这里变成了一本词典
因此,通过使用:
for key in cnt.keys():
print key, cnt[key]
您可以访问密钥和内容
a 4
c 2
b 5
p 1
r 1
w 2
您可以通过稍微修改它来实现您想要的。希望这有帮助首先,字典是一个无序的集合(也就是说,它没有保证键的顺序) 其次,每个dict键必须是唯一的 虽然你可以使用dict来计算字符的频率,但是有一个更好的解决方案。Python的
collections
模块中的Counter
类基于dict,专门为计数频率之类的任务而设计
from collections import Counter
letters = ['a', 'b', 'c', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'a', 'w', 'w', 'p', 'r']
cnt = Counter(letters)
print cnt
计数器的内容现在是:
计数器({'b':5,'a':4,'c':2,'w':2,'p':1,'r':1})
您可以方便地打印这些文件:
for char, freq in sorted(cnt.items()):
print char, freq
其中:
a 4
b 5
c 2
p 1
r 1
w 2
input=['a','b','c','a','a','b','b','b','b','c','a','w','w','p','r']
dict={}
for x in input:
if x in dict.keys():
dict[x]=dict[x]+1
else:
dict[x]=1
for k in dict.keys():
print k, dict[k]
dictionary
的语法错误。请用您在程序中使用的set
,而不是字典来更正它,当您将其声明为文本时,它将删除所有重复项。这是什么,更不用说字典了!还有选项。@Pajamas检查我的答案。请随意解释否决票,如果需要,我可以帮助澄清或增加答案的深度。