Python 按字母顺序对词典排序,并按频率打印

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_

我正在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_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
  • 字典不能定义为{'a','b'}。如果它是这样定义的,那么它是一个集合,在列表中找不到重复项
  • 如果您要定义一个字符,请用引号括起来,除非已经声明了它
  • 对于dictionary.keys():,不能像这样循环使用dictionary.keys()中的单词,因为dictionary不是字典类型
  • 如果您想在不使用任何内置函数的情况下编写代码,请尝试以下方法

    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检查我的答案。请随意解释否决票,如果需要,我可以帮助澄清或增加答案的深度。