【问题标题】:Count of each unique element in a list [duplicate]列表中每个唯一元素的计数[重复]
【发布时间】:2017-11-09 04:14:39
【问题描述】:

假设我有一个国家/地区列表

l = ['India', 'China', 'China', 'Japan', 'USA', 'India', 'USA']  

然后我有一个独特国家/地区的列表

ul = ['India', 'China', 'Japan', 'USA']

我想按升序计算列表中每个唯一国家/地区的数量。所以输出应该如下:

Japan 1
China 2
India 2
USA   2

【问题讨论】:

    标签: python count


    【解决方案1】:

    如果您不想使用Counter,您可以使用字典来计算自己(您已经知道独特的元素,因为您有ul):

    l = ['India', 'China', 'China', 'Japan', 'USA', 'India', 'USA'] 
    ul = ['India', 'China', 'Japan', 'USA']
    
    cnts = dict.fromkeys(ul, 0)  # initialize with 0
    
    # count them
    for item in l:
        cnts[item] += 1
    
    # print them in ascending order
    for name, cnt in sorted(cnts.items(), key=lambda x: x[1]):  # sort by the count in ascending order
        print(name, cnt)   
        # or in case you need the correct formatting (right padding for the name):
        # print('{:<5}'.format(name), cnt)  
    

    哪个打印:

    Japan 1
    China 2
    India 2
    USA   2
    

    【讨论】:

      【解决方案2】:

      如果您想根据ul 列表进行排序,您可以使用列表推导式:

      l = ['India', 'China', 'China', 'Japan', 'USA', 'India', 'USA']
      ul = ['India', 'China', 'Japan', 'USA']
      result = sorted([(x, l.count(x)) for x in ul], key=lambda y: y[1])
      for elem in result:
          print '{} {}'.format(elem[0], elem[1])
      

      输出:

      Japan 1
      India 2
      China 2
      USA 2
      

      如果你想在按count排序后按字母排序,可以将result改成如下:

      result = sorted(sorted([(x, l.count(x)) for x in ul]), key=lambda y: y[1])
      

      输出:

      Japan 1
      China 2
      India 2
      USA 2
      

      【讨论】:

      • 使用count 的列表理解比Counter 方法慢得多 - 与订单 n 相比,订单 n^2 只是为了计数。请参阅此答案进行分析:stackoverflow.com/a/23909767/2337736
      • 这种方法只是为了防止他有一个他想要搜索的预定义项目列表(如示例中所述),而不是所有项目
      • 即便如此,我认为您可能想要分析类似 ul_set = frozenset(ul); counts = Counter(country for country in countries if country in ul_set) 的内容 - 您确实希望避免在同一个列表中多次运行 count。我的意思是,这对于短名单来说很好,但您不妨使用更快的工具。
      【解决方案3】:

      您可以使用集合中的计数器:

      from collections import Counter
      
      l = ["India", "China", "China", "Japan", "USA", "India", "USA"]
      
      new_vals = Counter(l).most_common()
      new_vals = new_vals[::-1] #this sorts the list in ascending order
      
      for a, b in new_vals:
          print a, b
      

      【讨论】:

      • Counter(l).items() 的输出是否保证返回一个按计数排序的列表?我认为您需要使用most_common()
      • 同意。 Counter 文档给出了 n 最不常见的配方:c.most_common()[:-n-1:-1] - 如果 n 等于项目总数,则简化为通常的 [::-1]
      • @Ajax1234 如果我在我的数据上运行它并收到错误怎么办 - TypeError: unhashable type: 'dict'
      • 您是否使用了本例中硬编码的数据,即“l”?
      • 该异常表明您的列表至少包含一个字典 - 计数器要求您计数的元素是可散列的,而字典不是。
      猜你喜欢
      • 2020-06-27
      • 2019-09-02
      • 2021-07-25
      • 1970-01-01
      • 2018-02-07
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      相关资源
      最近更新 更多