我在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
你能告诉我哪里错了吗?
(顺便说一句,我不是程序员,而是语言学家,所以请放轻松我。)
答案 0 :(得分:3)
您使用的不是字典,而是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']
完成后,我们将使用lst.count()
方法查看列表中char出现的次数,并使用内置函数sorted()
对项进行排序:
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
希望这会有所帮助!!
答案 1 :(得分:0)
让我们从显而易见的开始:
dictionary= {a,b,c,a,a,b,b,b,b,c,a,w,w,p,r}
不是字典。它是set
,set
不保留重复项。您可能打算将其声明为list
或tuple
。
现在,问题就在于:你需要实现一些东西来计算你的收藏品。你的实现并没有真正做到这一点。你可以自己动手,但实际上你应该使用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的sorted
上调用items()
,这是一个元组列表,然后迭代它来进行打印。
for k,v in sorted(c.items()):
print('{}: {}'.format(k,v))
a: 4
b: 5
c: 2
p: 1
r: 1
w: 2
答案 2 :(得分:0)
字典就像这个{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
你可以通过稍微修改一下来实现你想要的。希望这是有帮助的
答案 3 :(得分:0)
for word in dictionary.keys():
循环,因为这里的字典不是字典类型。如果您想在不使用任何内置函数的情况下编写代码,请尝试使用
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]
答案 4 :(得分:-1)
首先,字典是无序集合(即,它没有保证其键的顺序)。
其次,每个dict键必须是唯一的。
虽然您可以使用dict计算字符的频率,但是解决方案更好。 Python的Counter
模块中的collections
类基于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
现在柜台的内容是:
Counter({'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