【问题标题】:Sorting a couple of lists together [duplicate]将几个列表排序在一起[重复]
【发布时间】:2020-05-15 15:22:36
【问题描述】:

我有 2 个列表:结果、发生时间 我想根据发生的时间对它们进行排序

这些是列表的打印输出:

    result is        ['3 - 1', '1 - 2', '0 - 0', '2 - 1', '2 - 3', '2 - 0' ...]
    occurredtimes is [322 , 423, 269, 643, 114, 565 ...]

我需要的输出是

    result           ['2 - 1', '2 - 0', '1 -2', '3 - 1', '0 - 0', '2 - 3' ...]
    occurredtimes    [643 , 565, 423, 322, 269, 114 ...]

我正在尝试对它们进行排序,但我无法得到我需要的东西;对不起,我确定这是一个简单的代码

我尝试如下

    result, occurredtimes = (list(t) for t in zip(*sorted(zip(result, occurredtimes))))

【问题讨论】:

标签: python


【解决方案1】:

试试:

result, occurredtimes=zip(*sorted(zip(result, occurredtimes), key=lambda k: k[1], reverse=True))

输出:

('2 - 1', '2 - 0', '1 - 2', '3 - 1', '0 - 0', '2 - 3')
(643, 565, 423, 322, 269, 114)

【讨论】:

    【解决方案2】:

    您可以使用sorted() 并传递一个 lambda 函数来对它们进行排序。

    In [9]: result = ['3 - 1', '1 - 2', '0 - 0', '2 - 1', '2 - 3', '2 - 0' ]
    
    In [10]: ocurredtimes= [322 , 423, 269, 643, 114, 565]
    
    In [11]: new_res=list( zip( result, ocurredtimes))
    
    
    In [13]: new_res
    Out[13]:
    [('3 - 1', 322),
     ('1 - 2', 423),
     ('0 - 0', 269),
     ('2 - 1', 643),
     ('2 - 3', 114),
     ('2 - 0', 565)]
    
    
    In [15]: sorted(new_res, key=lambda x:x[1],reverse=True) #sorted OUTPUT 
    Out[15]:
    [('2 - 1', 643),
     ('2 - 0', 565),
     ('1 - 2', 423),
     ('3 - 1', 322),
     ('0 - 0', 269),
     ('2 - 3', 114)]
    

    您也可以使用列表的sort 函数并将相同的 lambda 函数作为参数传递。这样就可以了。

    了解更多12

    【讨论】:

      【解决方案3】:
      >>> result, occurredtimes = zip(*sorted(zip(result, occurredtimes), key = lambda i: i[1], reverse=True))
      >>> result
      ('2 - 1', '2 - 0', '1 - 2', '3 - 1', '0 - 0', '2 - 3')
      >>> occurredtimes
      (643, 565, 423, 322, 269, 114)
      

      它的工作方式是您基本上可以zip 将列表按元素排列在一起。然后你可以按照occurredtimes中的[1]元素进行排序,然后使用reverse=True进行降序排序。

      >>> sorted(zip(result, occurredtimes), key = lambda i: i[1], reverse=True)
      [('2 - 1', 643), ('2 - 0', 565), ('1 - 2', 423), ('3 - 1', 322), ('0 - 0', 269), ('2 - 3', 114)]
      

      最后一个zip(*sorted( 是将已排序的元组再次解包到两个单独的列表中。

      【讨论】:

        【解决方案4】:

        您可以先将两个列表合并为一个列表,然后根据您需要的条件进行排序。代码将如下所示:

        result = ['3 - 1', '1 - 2', '0 - 0', '2 - 1', '2 - 3', '2 - 0']
        occurredtimes = [322 , 423, 269, 643, 114, 565]
        new_list=[]
        for i in range(len(result)):
            new_list.append([occurredtimes[i],result[I]])   
        new_list.sort(key=lambda x:x[0],reverse=True)
        print(new_list)
        

        【讨论】:

          【解决方案5】:

          我会使用 numpy 的 argsort。速度更快,代码更少:

          O = np.array([322 , 423, 269, 643, 114, 565])
          values = np.array(['3 - 1', '1 - 2', '0 - 0', '2 - 1', '2 - 3', '2 - 0'])
          arr = np.argsort(O)[::-1]
          print(values[arr])
          

          输出:

          array(['2 - 1', '2 - 0', '1 - 2', '3 - 1', '0 - 0', '2 - 3'], dtype='<U5')
          

          【讨论】:

            【解决方案6】:
            occurredtimes = np.argsort(occurredtimes)[::-1]
            
            print("result:", [ result[i] for i in occurredtimes ])
            print("occuredtimes:", occurredtimes)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-01-09
              • 2013-12-29
              • 1970-01-01
              • 2019-09-18
              • 2020-11-01
              • 1970-01-01
              • 1970-01-01
              • 2019-07-27
              相关资源
              最近更新 更多