按字母顺序返回字典键和值

时间:2014-02-01 22:46:10

标签: python python-3.x dictionary

我正在尝试在Python指南中进行此练习:

  

编写一个程序,在命令行中读取字符串并返回   按字母顺序排列的字母表   与字母一起出现在字符串中   发生。案例应该被忽略。程序的示例运行看起来   像这样:

$ python letter_counts.py "ThiS is String with Upper and lower case Letters."
a  2
c  1
d  1
e  5
g  1
h  2
i  4
l  2
n  2
o  1
p  2
r  4
s  5
t  5
u  1
w  2
$

我已经编写了一个函数来计算字母并将它们与相应的值一起存储在字典中:

def count_all(text):
    text = text.lower()
    counts = {}
    for char in text:
        if char not in counts:
            counts.setdefault(char,1)
        else:
            counts[char] = counts[char] + 1
    print(counts)

但是我很惭愧地说我甚至傻眼了,你甚至可以使用任何规则来订购映射类型的项目。我是否必须将它们转换为列表?我是否需要在任何时候使用ord()

编辑:根据我得到的答案,我设法使该功能按字母顺序打印出来,而不必使用任何我还不完全理解的方法。这是完整的事情:

def count_all(text):
    text = text.lower()
    counts = {}
    for char in text:
        if char not in counts:
            counts.setdefault(char,1)
        else:
            counts[char] = counts[char] + 1
    counts = sorted(counts.items())
    for i in counts:
        print(i[0],' ',i[1])

count_all('banana')

这是一个很好的解决方案吗?如何改进?

5 个答案:

答案 0 :(得分:1)

在函数return中添加count_all语句以返回字典

def count_all(text):
    ...
    return counts

然后您可以使用sorted内置函数和for循环:

for e in sorted(count_all("ThiS is String with Upper and lower case Letters").items()):
    print e[0], e[1]

请注意,some_dict.items()方法会返回tuple形式的(key, value)对。

另外,因为看起来你不想算“。”或空格,您可以使用:

text = "".join(text.strip(".").split()).lower()

答案 1 :(得分:0)

假设您的数据在字典中:

txt='''\
a  2
c  1
d  1
e  5
g  1
h  2
i  4
l  2
n  2
o  1
p  2
r  4
s  5
t  5
u  1
w  2'''

d=dict([tuple(e.split()) for e in txt.splitlines()])
# d={'p': '2', 'r': '4', 's': '5', 't': '5', 'u': '1', 'w': '2', 'a': '2', 'c': '1', 'd': '1', 'e': '5', 'g': '1', 'h': '2', 'i': '4', 'l': '2', 'n': '2', 'o': '1'}

如果您只想通过密钥打印d,则可以直接使用sorted

print(sorted(d.items()))

现在,如果你想先按字母的频率排序a),那么b)用字母:

li=sorted(d.items(), key=lambda t: (t[1], -ord(t[0])), reverse=True)
# li=
('e', '5')
('s', '5')
('t', '5')
('i', '4')
('r', '4')
('a', '2')
('h', '2')
('l', '2')
('n', '2')
('p', '2')
('w', '2')
('c', '1')
('d', '1')
('g', '1')
('o', '1')
('u', '1')

答案 2 :(得分:0)

s = 'ThiS is String with Upper and lower case Letters.'

# Or see Python's Counter class: counts = Counter(s.lower())
counts = {}
for c in s.lower():
    counts[c] = counts.get(c, 0) + 1

for c, n in sorted(counts.items()):
    print(c, n)

答案 3 :(得分:0)

排序工作,并且在stackoverflow上非常流行,但是比排序(2.x和3.x)慢得多,并且往往会产生过长的代码行。

所以:

items = list(counts.items())
items.sort()
for key, value in items:
    # do something with key and value

上述内容应该适用于2.x和3.x,但未经测试。

如前所述,collections.Counter()在这种情况下更接近您想要做的事情,并且在2.x和3.x中均可用。

如果您在循环内进行排序,那么您可能希望使用类似字典的树而不是字典(哈希表)。但你不是,所以使用字典和单一种类更有效。

如果你在一个循环中进行排序,这里有几个类似于字典的树(支持2.x和3.x,包括jython和pypy),它们按键顺序保存它们的数据: http://stromberg.dnsalias.org/~dstromberg/datastructures/ http://stromberg.dnsalias.org/~strombrg/python-tree-and-heap-comparison/2014-01/

还有所谓的collections.OrderedDict(),但它以插入顺序存储数据,而不是键顺序。

HTH

答案 4 :(得分:0)

我做了同样的作业,并设法解决了。 PS:这是我自己的想法,所以可能会有更好的方法。

diction ={}
Input = input()
INPUT = Input.lower()
characterlist = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
for i in characterlist:
    diction[i]= INPUT.count(i,0,100)
    if diction[i]==0:
        del diction[i]

for k in diction:
    print(k,diction[k])