【问题标题】:Sort a dictionary alphabetically, and print it by frequency按字母顺序对字典进行排序,并按频率打印
【发布时间】:2013-10-29 06:00:25
【问题描述】:

我在 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 的语法错误。请使用您在程序中使用的语法进行更正
  • 这是一个set,不是字典,第二个你将它声明为文字,它会删除所有重复项。
  • 随便吧,还不如字典!
  • OrderedDictCounter 是选项。
  • @Pajamas 检查我的答案。

标签: python dictionary tabular alphabetical


【解决方案1】:

您使用的不是字典,而是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() 方法查看列表中某个字符的出现次数,并使用内置函数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

希望这会有所帮助!

【讨论】:

    【解决方案2】:

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

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

    不是字典。它是一个set,并且sets 不保留重复项。您可能打算将其声明为 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 对象)不保留键顺序。您需要在字典的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
    

    【讨论】:

      【解决方案3】:

      字典类似于 this{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
      

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

      【讨论】:

        【解决方案4】:
        1. 字典不能定义为 {'a','b'}。如果它是这样定义的,那么它就是一个集合,您在列表中找不到重复项
        2. 如果您定义了一个字符,除非已经声明,否则请用引号括起来。
        3. 你不能像这样循环遍历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]
        

        【讨论】:

          【解决方案5】:

          首先,字典是一个无序的集合(即,它的键没有保证的顺序)。

          第二,每个dict键必须是唯一的。

          虽然您可以使用 dict 计算字符的频率,但有更好的解决方案。 Python 的collections 模块中的Counter 类基于字典,专为计算频率等任务而设计。

          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
          

          【讨论】:

          • 欢迎解释否决票,如果需要,我可以帮助澄清或增加答案的深度。
          猜你喜欢
          • 2020-02-06
          • 2021-02-21
          • 2018-01-27
          • 1970-01-01
          • 1970-01-01
          • 2021-12-20
          • 2020-11-26
          • 1970-01-01
          相关资源
          最近更新 更多