【问题标题】:Python: How to efficiently catch "duplicates" in a list, then run a comparison between them?Python:如何有效地捕获列表中的“重复项”,然后在它们之间进行比较?
【发布时间】:2015-09-11 03:32:39
【问题描述】:

我浏览过以前的帖子,其中一些关于复杂性的帖子中有很多 cmets,而其他 cmets 说某些解决方案不适用于 Python 2.7。所以我希望这不是重复的。

我有一个很长的列表,类似于这样的内容

my_list = ['Elephant 300', 'Giraffe 900', 'Monkey 84', 'Elephant 298', 'Tiger  428',...]

我需要我的代码捕获'Elephant 300''Elephant 298',然后比较尾随数字,并消除较低的数字,这样列表就只包含'Elephant 300'

如何在高效的同时做到这一点(希望不会过于复杂)?

【问题讨论】:

  • 您正在寻找一个艰难的解决方案,因为您错误地陈述了您的问题。您选择的数据结构是错误的比较工具 - 所以您需要选择一个更合适的数据结构,例如。 G。元组列表、字典等。并且可以看看文章“整理数据”——它是为数据科学家编写的,但(有点抽象)对每个人都有用

标签: performance list python-2.7 compare grouping


【解决方案1】:

您需要创建一个字典,其中键是“大象”、“长颈鹿”等,值是数字。为给定动物存储的数字将是迄今为止该动物看到的最大数字。您将遍历列表,将每个字符串拆分为动物和数字,然后将数字与字典中为该动物存储的数字进行比较。如果新号码更大,您将用新号码替换旧号码。 当这一切都完成后,你将遍历字典中的键值对,创建新的字符串,并将它们放入一个列表中。 这很有效。

【讨论】:

    【解决方案2】:

    我会做如下的事情:

    d = {}
    for item in list_of_animals:
        k,v = item.split()
        if not k in d:
            d[k] = int(v) #store value at name of animal
        else:
            if int(v) > d[k]:
                d[k] = int(v) #higher number becomes new value for animal name
    
    #put values back in list
    l = ['='.join((k, str(v))) for k, v in d.items()]
    

    【讨论】:

      【解决方案3】:

      这可能是defaultdict 的好地方。

      from collections import defaultdict
      d = defaultdict(int)
      for k,v in [i.split() for i in my_list]:
          if d[k] < v:
              d[k] = v
      my_new_list = [' '.join([str(k),str(d[k])]) for k in d]
      

      【讨论】:

        【解决方案4】:
        my_list = ['Elephant 300', 'Giraffe 900', 'Monkey 84', 'Elephant 298', 'Tiger  428']
        my_dict = {}
        
        for item in my_list:
            key, value = item.split()
            if key in my_dict.keys():
                stored_val = my_dict[key]
                if float(stored_val) < float(value):
                    my_dict[key] = value
            else:
                my_dict[key] = value
        
        print my_dict
        
         #If you want a list back
        my_new_list = [key+' '+my_dict[key] for key in my_dict.keys()]
        print my_new_list
        

        输出:

        {'老虎':'428','长颈鹿':'900','猴子':'84','大象':'300'}

        ['老虎 428'、'长颈鹿 900'、'猴子 84'、'大象 300']

        注意:您还可以在 my_dict 中存储特定键的多个值,然后消除较低的值。我选择比较这些值并只存储较大的值。希望对您有所帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-12
          • 1970-01-01
          • 2020-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多