【问题标题】:How to map a list of strings and list of integers and print the string that has the second greatest value如何映射字符串列表和整数列表并打印具有第二大值的字符串
【发布时间】:2019-04-18 14:08:40
【问题描述】:

我一直为此烦恼。我有两个列表

lista = ["a", "b", "c", "d"]

listb = [80, 90, 70, 60]

我想这样映射它

“a”的值为 80

“b”的值为 90

“c”的值为 70 并且

“d”的值为 60

然后,我想打印具有第二大值的字符串,即“a”

有什么办法吗?

【问题讨论】:

  • 我们刚刚完成了你的一项家庭作业吗?

标签: python list sorting int


【解决方案1】:

要确定第二高的值,您需要至少跟踪迭代中的前两个值。所以再次使用heapq,类似于your previous problem

from heapq import nlargest

lista = ["a", "b", "c", "d"]
listb = [80, 90, 70, 60]

n = 2
idx, _ = zip(*nlargest(n, enumerate(listb), key=lambda x: x[1]))  # (1, 0)
key = lista[idx[-1]]                                              # 'a'

只有对于较大的 n 值,您才应该考虑全排序,sorted 可能表现更好。

【讨论】:

    【解决方案2】:

    可以使用argsort'ing listb 来完成,它返回已排序项目的索引。然后从索引第二高的lista 中选择。 argsortnumpy 中可用。

    import numpy
    
    second_largest_str = lista[numpy.argsort(listb)[-2]]
    print(second_largest_str)
    

    【讨论】:

      【解决方案3】:

      解决此问题的一种方法是创建一个字典,其中字符列表是 Key,整数列表是 Values

      可能有很多方法可以做到这一点,这只是一种!

      Zip 获取两个列表并从中创建一个字典,第一个参数是键,第二个参数是值

      a = ["A", "B", "C"]
      b = [1, 2, 3]
      dict_1 = dict(zip(a,b))
      print(dict_1)
      >>> {'A': 1, 'B': 2, 'C': 3}
      

      然后您可以使用它按值从小到大对字典进行排序

      x = sorted((k,v) for v,k in dict_1.items())
      

      然后要访问倒数第二个,您可以从右侧访问字典(负索引)

      print(x[-2])
      >>> (3, 'C') 
      

      【讨论】:

        【解决方案4】:

        您可以为此使用pandas

        import pandas as pd
        
        In [2210]: lista = ["a", "b", "c", "d"]
        
        In [2211]: listb = [80, 90, 70, 60]
        
        In [2213]: df = pd.DataFrame(lista)
        
        In [2214]: df['listb'] = listb
        
        In [2215]: df
        Out[2215]: 
           0  listb
        0  a     80
        1  b     90
        2  c     70
        3  d     60
        

        然后找到第二高的,如下所示:

        In [2228]: df.nlargest(2, 'listb').tail(1).values.tolist()
        Out[2228]: [['a', 80]]
        

        【讨论】:

          【解决方案5】:

          这是一个足够简单的版本

          d = {}
          l = ["a", "b", "c", "d"]
          j = [80, 90, 70, 60]
          
          for i in range(len(l)):
              d[str(l[i])] = j[i]
          
          d = sorted(d.items(), key=lambda x: x[1], reverse=True)
          print(d[1])
          

          【讨论】:

            【解决方案6】:

            sorted() 函数接受一个可选的键参数:

            lista = ["a", "b", "c", "d"] 
            listb = [80, 90, 70, 60] 
            
            pairs = zip(lista, listb)
            sorted_tuples = sorted(pairs, key=(lambda pair : pair[1]), reverse=True)
            str_with_second_highest_nr = sorted_tuples[1][0]
            

            您可以将其压缩到一对 lista 和 listb 中,并在每个元组中的第二项之后将它们排序,并使用 lambda 函数作为关键参数。 然后只需选择第二对的第一个位置

            >>> print(sorted_tuples)
            [('b', 90), ('a', 80), ('c', 70), ('d', 60)]
            
            >>> print(str_with_second_highest_nr)
            a
            

            【讨论】:

              猜你喜欢
              • 2019-04-17
              • 1970-01-01
              • 2013-09-14
              • 1970-01-01
              • 2018-11-15
              • 1970-01-01
              • 1970-01-01
              • 2018-12-21
              • 2018-01-13
              相关资源
              最近更新 更多