【问题标题】:How do I align two arrays after I've sorted 1 one of them?在对其中的 1 个进行排序后,如何对齐两个数组?
【发布时间】:2023-04-07 18:57:01
【问题描述】:

我有两个列表,它们的值与其他位置相匹配。所以 Jon 的分数是 123,Bede 的分数是 11,以此类推。

name = ["Jon", "Bede", "Joe"]
score = [123, 11, 43]

如何对列表进行排序,使其输出最小分数先升到最高分数,每次输出得分的人的名字。

【问题讨论】:

标签: python arrays list


【解决方案1】:
for s, n in sorted(zip(score, name)): # sort by score.
    print(n, s)

【讨论】:

    【解决方案2】:

    如果您有两个索引相关的列表,则很难使它们保持同步。 python的解决方案是一个元组列表,其中每个元组中的第一个元素是名称,第二个元素是分数:

    names_with_score = [
        ("Jon", 123),
        ("Bede", 11),
        ("Joe", 43),
    ]
    names_with_score.sort(key=lambda x: x[1]) # sort with the second element
    

    如果您无法控制数据的传递方式,您可以使用 zip 功能加入列表:

    names_with_score = zip(name, score)
    

    【讨论】:

      【解决方案3】:

      如果您不介意的话,这会合并列表:

      sorted(zip(name,score))
      

      【讨论】:

      • 这不会合并这两个列表。它只是将它们压缩起来,并按名称的第一个元素对压缩后的元组列表进行排序。
      • lol 好吧,根据 zip() 文档,它“聚合”了元素。这就是为什么 python 是这样的原因。顺便说一句。
      • 英语不是我的母语,请耐心等待。但我认为聚合事物是像 zip 正在做的那样将它们“捆绑”起来,而另一方面 merging 列表更像是 exteding 一个列表与另一个列表有一些规则是否保留或丢弃重复项(更像是集合并集,但用于列表)。我可能错了。
      【解决方案4】:

      与其坚持使用一对平行的lists,不如尝试将它们变成字典以便于访问。然后,您可以使用 key 参数按字典的键对字典进行排序:

      name = ["Jon", "Bede", "Joe"]
      score = [123, 11, 43]
      results = dict(zip(name, score))
      for k in sorted(results, key=results.get):
          print('{}: {}'.format(k, results[k]))
      

      结果:

      Bede: 11
      Joe: 43
      Jon: 123
      

      【讨论】:

      • 输出是降序而不是升序。
      • OP 说输出最小分数先升到最高分数,所以我们这里不需要reverse :)
      • 我可以发誓它先说最高分……我一定累了。谢谢。
      • 否决 将排序切换到正确的顺序?有没有其他方法可以改进这个答案?
      【解决方案5】:

      这个呢?

      name = ["Jon", "Bede", "Joe"]
      score = [123, 11, 43]
      
      for i in sorted(zip(name, score), key=lambda x:x[1]):
          print(i[0], i[1], sep=': ')
      

      输出:

      Bede: 11
      Joe: 43
      Jon: 123
      

      【讨论】:

      • 列表理解解决方案在逻辑上是不正确的。在 list comp 中打印不是 pythonic。实际上它在 python2 中是非法的。这更像是滥用列表组合。
      • @dopstar 谢谢,对 Python 2 不太了解。我会删除它们 :)
      • @Kevin 您的代码似乎不正确,您首先按名称排序。试试这个输入:name = ["Dean", "Bede", "Joe", "Al"];score = [123, 11, 43, 43]
      • @Kevin:现在看来还可以;)
      【解决方案6】:

      您可以使用zip(...) 将两个列表聚合在一起;然后排序;然后使用zip(*...)解压结果。

      name = ["Jon", "Bede", "Joe"]
      score = [123, 11, 43]
      newscore, newname = map(list, zip(*sorted(zip(score, name))))
      print(newname)
      print(newscore)
      # ['Bede', 'Joe', 'Jon']
      # [11, 43, 123]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-07
        • 2014-07-22
        • 2016-07-26
        相关资源
        最近更新 更多