【问题标题】:Python: Sort list with parallel listPython:使用并行列表排序列表
【发布时间】:2011-07-14 03:22:21
【问题描述】:

我有一个包含 HTML 元素的列表。我还有一个包含日期/时间的列表,它与 HTML 列表平行。

如何根据时间/日期列表对 HTML 列表进行排序?时间/日期采用时间戳格式。

【问题讨论】:

    标签: python list sorting


    【解决方案1】:

    您可以使用zip

    timestamps, elements = zip(*sorted(zip(timestamps, elements)))
    

    结果将是两个元组,如果您愿意,可以将它们转换为列表。

    【讨论】:

    • @Thomas — 不要难过! sort() 是就地的,而 sorted() 创建一个新列表,所以 sort() 它通常是你想要的大列表。 :-)
    • 谢谢。倒退呢?
    • 很奇怪,同一个函数可以压缩和解压缩值。这样就很难理解函数了。
    • zip 不解压缩,但 * 解压缩排序后的 zip 对象,然后再次被 zip 压缩。
    【解决方案2】:

    将两个列表压缩成元组,排序,然后从元组中取出 HTML:

    zipped = zip(timestamps, htmls)
    zipped.sort()
    sorted_htmls = [html for (timestamp, html) in zipped]
    

    【讨论】:

      【解决方案3】:

      Enumerate 将为您提供列表中每个项目的 (index,item) 元组列表。您可以使用索引对其进行排序,以从时间戳列表中读取排序键。然后剥掉html元素:

      sorted_elems = [elem for i,elem in sorted(enumerate(html_elements), 
                                                key=lambda x:timestamps[x[0]])]
      

      还有什么比这更简单的?

      【讨论】:

        【解决方案4】:

        您可以使用名为more_itertools 的第三方包:

        import more_itertools 
        
        timestamps = ["08-11-17", "01-13-17", "11-22-17"]
        elements = ["<p>", "<b>", "<a href>"]
        more_itertools.sort_together([timestamps, elements])
        # [('01-13-17', '08-11-17', '11-22-17'), ('<b>', '<p>', '<a href>')]
        

        更多信息请参见more_itertools docs

        【讨论】:

          猜你喜欢
          • 2021-07-19
          • 2014-03-13
          • 2020-10-25
          • 1970-01-01
          • 1970-01-01
          • 2022-12-21
          • 2015-05-27
          • 1970-01-01
          • 2018-05-03
          相关资源
          最近更新 更多