【问题标题】:How to sort a list according to another list? Python如何根据另一个列表对列表进行排序? Python
【发布时间】:2015-04-26 10:41:20
【问题描述】:

如果我有一份清单:

name = ['Megan', 'Harriet', 'Henry', 'Beth', 'George']

我还有另一个列表,其中每个值代表正确顺序的名称

score_list = [9, 6, 5, 6, 10]

所以 Megan = 9 和 Beth = 6(顺便说一句,这是来自字典)

我将如何按字母顺序对名称进行排序但保持 score_list 匹配名称? 我已经使用冒泡排序方法对数字进行了排序,但没有使用字符串。

【问题讨论】:

  • 看看zip函数。
  • 当你发现自己需要这种操作时,尽管这写起来很简单,但想想是“结构列表”还是“列表结构”更好。
  • 由于这些列表来自 dict,最好直接从 dict 构建元组列表,而不是单独提取列表,然后将它们重新压缩到元组列表中。跨度>

标签: python list sorting python-3.3


【解决方案1】:

您可以使用zip 将它们与元组同时排序。排序将按名称进行:

tuples = sorted(zip(name, score_list))

然后

name, score_list = [t[0] for t in tuples], [t[1] for t in tuples]

【讨论】:

    【解决方案2】:

    一个明显的方法是对zip两个列表进行排序然后解压缩

    >>> name, score = zip(*sorted(zip(name, score_list)))
    >>> name
    ('Beth', 'George', 'Harriet', 'Henry', 'Megan')
    >>> score
    (6, 10, 6, 5, 9)
    

    【讨论】:

    • 感谢您的快速回复,但是当我加载程序时它说'TypeError:'zip' object is not subscriptable' 我正在运行 3.3.5 python btw
    【解决方案3】:

    如果你有一个dict,正确的方法是按键排序:

    name = ['Megan', 'Harriet', 'Henry', 'Beth', 'George']
    
    score_list = [9, 6, 5, 6, 10]
    d = dict(zip(name, score_list))
    
    from operator import itemgetter
    print(sorted(d.items(), key=itemgetter(0)))
    [('Beth', 6), ('George', 10), ('Harriet', 6), ('Henry', 5), ('Megan', 9)]
    

    【讨论】:

    • 是的错过了他有一个字典
    【解决方案4】:

    考虑使用第三方工具more_itertools.sort_together

    给定

    import more_itertools as mit
    
    
    name = ["Megan", "Harriet", "Henry", "Beth", "George"]
    score_list = [9, 6, 5, 6, 10]
    

    代码

    mit.sort_together([name, score_list])
    # [('Beth', 'George', 'Harriet', 'Henry', 'Megan'), (6, 10, 6, 5, 9)]
    

    通过> pip install more_itertools安装more_itertools

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 2013-09-12
      • 1970-01-01
      • 2023-04-01
      • 2021-05-02
      • 2011-03-22
      相关资源
      最近更新 更多