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

2024-09-27 07:34:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我在mac上运行Python2.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

你能告诉我错误在哪里吗? (顺便说一句,我不是程序员,而是语言学家,所以请放轻松。)


Tags: innewforstringdictionary字典valuemac
3条回答

字典是这样的{key1:content1, key2:content2, ...}字典中的键是唯一的。那么a = {1,2,3,4,5,5,4,5,6}就是集合,当您打印出来时,您会注意到

print a
set([1,2,3,4,5,6])

消除重复项。

在您的情况下,可以使用的更好的数据结构是一个列表,其中可以包含多个重复项。

如果要计算内部的元素数,一个更好的选项是collections.Counter,例如:

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

你可以通过稍微修改一下来实现你想要的。希望这对你有帮助

让我们从显而易见的开始,这:

dictionary= {a,b,c,a,a,b,b,b,b,c,a,w,w,p,r}

不是字典。它是一个set,并且set不保留重复项。你可能打算声明为listtuple

现在,来谈谈你的问题:你需要实现一些东西来计算你收藏的物品。你的实现并不能真正做到这一点。你可以自己滚,但实际上你应该使用一个Counter

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

你用的不是字典,而是set!:)

集合不允许重复。

你可能需要的不是字典,而是列表。

一点解释

字典有键,每个唯一键都有自己的值:

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的内容:

>>> 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

希望这有帮助!!

相关问题 更多 >

    热门问题