【问题标题】:Identify and count repeated words in the list识别和计算列表中的重复单词
【发布时间】:2021-04-18 21:27:06
【问题描述】:

我想创建一个元素拼写不重复的新列表和一个包含重复次数的新列表。

像这样

list=["jim","jennifer","roy","roy","mike","jim","roy","jim",mike","roy"]

我想创建 2 个这样的列表:

  • list1=["jim","jennifer","roy","mike"] 包含 list 的独特元素
  • list2=[3,1,4,2] 包含每个唯一元素的出现次数。

我试过了

number_of_repeats=[]

for i in range(len(list)):
     number_of_repeats.append(list.count(list[i]))

这个给我

number_of_repeats=[3,1,4,4,2,3,4,3,2,4]

我怎样才能得到像 list1 和 list2 这样的输出?

【问题讨论】:

  • 试试 '''set()'''
  • 一个set可以帮助你。
  • 1.不要调用变量list 或其他python 单词。通过这样做,您最终隐藏了 Python 的实际内置 list 类。 2.“从列表中获取唯一元素”和“从列表中计算唯一元素”在其他问题中得到了广泛的介绍。请在 Stack Overflow 上执行 some research before asking。请拨打tour,阅读How to Ask,提出具体问题并提供minimal reproducible example,以重现您的问题。欢迎使用 Stack Overflow!
  • 这能回答你的问题吗? How do I count unique values inside a list
  • 你注意到实际列表中的语法错误了吗?

标签: python list


【解决方案1】:

这是一种使用集合和函数 count() 的方法

lst1 = ["jim","jennifer","roy","roy","mike","jim","roy","jim","mike","roy"]
lst2 = []
set1 = set(lst1)

for i in set1: 
    lst2.append(lst1.count(i))

lst1 = list(set(lst1))
print(lst1)
print(lst2)

输出:

['jim', 'jennifer', 'mike', 'roy']
[3, 1, 2, 4]

【讨论】:

    【解决方案2】:

    如 cmets 中所述,不要调用变量列表或其他 python 单词。通过这样做,您最终隐藏了 Python 的实际内置列表类。假设您的初始列表是items

    items = ["jim","jennifer","roy","roy","mike","jim","roy","jim","mike","roy"]
    list1 = list(dict.fromkeys(items))
    list2 = [items.count(i) for i in list1]
    

    输出:

    ['jim', 'jennifer', 'roy', 'mike']
    [3, 1, 4, 2]
    

    【讨论】:

      【解决方案3】:

      将列表转换为集合再转换回列表可以消除重复项:

      my_list=["jim","jennifer","roy","roy","mike","jim","roy","jim","mike","roy"]
      list1 = list(set(my_list))
      list2 = [my_list.count(item) for item in list1]
      
      #prints: ['jennifer', 'roy', 'mike', 'jim']
      #        [1, 4, 2, 3]
      

      【讨论】:

        【解决方案4】:
        def non_repetitive(list):
        
            list1=[]
            list2=[]
        
            for i in list:
                if not i in list1:
                    list1.append(i)
        
        
            for j in list1:
                counter=0
                for k in list:
                    if j==k:
                        counter+=1
                list2.append(counter)
        
        
            return list1, list2
        
        
        
        list=["jim","jennifer","roy","roy","mike","jim","roy","jim","mike","roy"]
        
        print(non_repetitive(list))
        

        【讨论】:

        • 我修复了您回答中提到的显示问题。您是否已经知道将变量或参数命名为list 不是一个好主意?
        【解决方案5】:

        我认为 dictionary 在这里做得很好,不仅在实施方面,

        # count occurrences of unique strings
        def str_frequency(names):
            d = dict()
            for name in names:
              d[name] = d.get(name, 0)+1
            return d
        
        # input: a list of names that may contain duplicates
        names = ["jim", "jennifer", "roy", "roy", "mike", "jim", "roy", "jim", "mike", "roy"]
        
        # result: unique names and their counts
        sf = str_frequency(names)
        
        print(sf)
        
        

        ...但也用于提供最终结果:

        {'jim': 3, 'jennifer': 1, 'roy': 4, 'mike': 2}
        

        如果您真的坚持使用list1list2,请了解keys()values() 方法。

        【讨论】:

          【解决方案6】:

          我认为您只是使用集合包来加速。如果你使用正常的方式,你会得到 O(n^2) 但是当使用集合时,它将是 O(n)

          from collections import Counter
          
          list_string = ["jim","jennifer","roy","roy","mike","jim","roy","jim","mike","roy"]
          list_string = dict(Counter(list_string))
          list_1 = list(list_string.keys())
          list_2 = list(list_string.values())
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-02-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多