【问题标题】:Subset a list of tuples by max value in Python在Python中按最大值对元组列表进行子集
【发布时间】:2016-06-15 20:56:04
【问题描述】:

我的问题来自这个discussion。我很抱歉,但由于我的水平,我无法添加评论以在另一个答案下提出我的问题。我有这个元组列表:

my_list = [('Scaffold100019', 98310), ('Scaffold100019', 14807), ('Scaffold100425', 197577), ('Scaffold100636', 326), ('Scaffold10064', 85415), ('Scaffold10064', 94518)]

我想制作一个字典,它只存储定义为元组第一个元素的每个键的最大值:

my_dict = {'Scaffold100019': 98310, 'Scaffold100425': 197577, 'Scaffold100636': 326, 'Scaffold10064': 94518}

从 Marcus Müller 的回答开始,我有:

d = {}

#build a dictionary of lists
for x,y in my_list: d.setdefault(x,[]).append(y)

my_dict = {}

#build a dictionary with the max value only
for item in d: my_dict[item] = max(d[item])

通过这种方式我达到了我的目标,但是,有没有更时尚的方式来完成这项任务?

【问题讨论】:

    标签: list python-2.7 dictionary tuples


    【解决方案1】:

    你可以使用collections.defaultdict

    from collections import defaultdict
    
    d = defaultdict(int)
    for key, value in my_list:
        d[key] = max(d[key], value)
    

    上面的代码适用于您的示例数据,但只有在每个键都有一个非负的最大值时才能正常工作。这是因为defaultdict(int) 在未设置值时返回零,因此如果给定键的所有值都是负数,则生成的最大值将错误地为零。

    如果给定键可能是纯负值,您可以进行以下更改:

    d = defaultdict(lambda: -float('inf'))
    

    通过此更改,当未设置键时将返回负无穷大,因此负值不再是问题。

    【讨论】:

      【解决方案2】:

      我建议这个解决方案只有一个循环,可读性强:

      my_dict = {}
      
      for x,y in my_list:
          if x in my_dict.keys():
              my_dict [x] = max (y, my_dict [x])
          else:
              my_dict [x] = y
      

      【讨论】:

        【解决方案3】:

        使用一切都大于None 的事实和带有None 作为后备返回值的字典get 方法。

        >>> d = {}
        >>> for name, value in my_list:
        ...     if value > d.get(name, None):
        ...         d[name] = value
        ... 
        >>> d
        {'Scaffold100425': 197577, 'Scaffold10064': 94518, 'Scaffold100019': 98310, 'Scaffold100636': 326}
        

        这将适用于所有值和哈希,每个循环最多两次。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-08-11
          • 1970-01-01
          • 2016-03-20
          • 1970-01-01
          • 1970-01-01
          • 2022-01-25
          • 2020-11-10
          相关资源
          最近更新 更多