【问题标题】:Accessing first element of a sorted nested list for second smallest second element访问排序嵌套列表的第一个元素以获得第二小的第二个元素
【发布时间】:2018-11-02 09:07:25
【问题描述】:

我有一个嵌套链表:

list_a = [[A, 12.1], [B, 15.6], [C, 9.8], [D, 12.1], [F, 96.3]]

根据子列表的第二个元素,我已经使用sorted(list_a) 成功地对列表进行了排序。如何获得输出 A 和 D(具有第二小第二元素的列表的第一元素)?

【问题讨论】:

    标签: python python-3.x list sorting


    【解决方案1】:

    这里不需要完整的排序。您可以使用 heap.nsmallest 后跟列表理解:

    from heapq import nsmallest
    from operator import itemgetter
    
    list_a = [['A', 12.1], ['B', 15.6], ['C', 9.8], ['D', 12.1], ['F', 96.3]]
    
    second_largest_val = nsmallest(2, map(itemgetter(1), list_a))[1]
    res = [key for key, val in list_a if val == second_largest_val]
    
    # ['A', 'D']
    

    【讨论】:

      【解决方案2】:

      您可以使用以下条件list comprehension

      list_a = [['A', 12.1], ['B', 15.6], ['C', 9.8], ['D', 12.1], ['F', 96.3]]
      sorted_a = sorted(list_a, key=lambda x: x[1])
      [x for x, y in sorted_a if y == sorted_a[1][1]]
      # ['A', 'D']
      

      但是,这确实会检查 float 对象的相等性,即 is not ideal。因此,您可能希望使用 Python >= 3.5 中可用的math.isclose

      from math import isclose
      [x for x, y in sorted_a if isclose(y, sorted_a[1][1])]
      # ['A', 'D']
      

      【讨论】:

      • 你能解释一下 isclose(y, sorted_a[1][1]) 是做什么的吗?更具体地说, sorted_a[1][1] 是否专门指第二个 sub_list 的第二个元素?如果是这样,我们如何遇到至少一个以上的第二元素..
      • 我在答案中将文档链接到isclose。由于浮点数存在精度问题,因此此函数允许您断言近似相等。 sorted_a[1][1] 确实引用了第二个 sub_list (12.1) 的第二个元素,并且理解收集了该第二个元素的所有第一个元素。
      猜你喜欢
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多