【问题标题】:Sort a list of lists according to another list [duplicate]根据另一个列表对列表列表进行排序[重复]
【发布时间】:2013-09-17 04:30:49
【问题描述】:

你会如何根据sorter_list中的项目顺序对lista进行排序:

lista = [["John", "B3"],["Robert", "P3"], ["Thomas", "S2"]]

sorter_list = ["P3", "S2", "B3"]

结果将是:

sorted_lista = [ ["Robert", "P3"], ["Thomas", "S2"], ["John", "B3"]]

问候

【问题讨论】:

  • 您的sorter_listS2 而不是S4。这是故意的吗?

标签: python list sorting


【解决方案1】:

虽然@F.J 有一个完美的解决方案,但我的问题是,你为什么不首先使用字典来存储这种数据?

带字典:

d = {'B3': 'John', 'P3': 'Robert', 'S2': 'Thomas'}
sorter = ["P3", "S2", "B3"]
print([(d[key], key) for key in sorter])

输出:

[('Robert', 'P3'), ('Thomas', 'S2'), ('John', 'B3')]

另外:您还应该检查collections 模块的OrderedDict

更新:

当然,您可以将值存储为列表,因此可以保存多个值:

带字典:

d = {'B3': [('John', 123)], 'P3': [('Robert', 465), ('Andres', 468)], 'S2': [('Thomas', 19)]}
sorter = ('P3', 'B3', 'S2')
print([(d[key], key) for key in sorter])

输出:

[([('Robert', 465), ('Andres', 468)], 'P3'), ([('John', 123)], 'B3'), ([('Thomas', 19)], 'S2')]

在这种情况下,您还可以在字典中使用字典:

d = {'B3': {'John': 123}, 'P3': {'Robert': 465, 'Andres': 468}, 'S2': {'Thomas': 19}}

以后查找会容易得多。

【讨论】:

  • 谢谢,如果 sorter 是列表而不是字典,我想知道如何排序。
  • 您需要知道一件事:如果sorter 有密钥,则d 没有此代码 sn-p 将引发KeyError
  • 我注意到,超过 1 个人可以将“P3”作为排序项,例如[["John", "B3"],["Robert", "P3"], ["Andres", "P3"], ["Thomas", "S2"]]
  • 是的,这是字典不能拥有的一件事:两个相同的键.. 所以如果你想防止这种情况发生,请使用键的名称和字母+数字组合.. 我会更新我的代码!
  • 而lista的item可以有多个元素,这就是数据存储在一个list中的原因,比如[["John", "B3", 123],["Robert", "P3", 465], ["Andres", "P3",468], ["Thomas", "S2",19]]
【解决方案2】:

我是 python 新手,所以它可能不是最优化的解决方案

sorted_lista=[]

for i in sorter_list:
    for j in lista:
        if i==j[1]:
            sorted_lista.append([j[0],j[1]])

print sorted_lista

输出:

[['Robert', 'P3'], ['Thomas', 'S2'], ['John', 'B3']]

【讨论】:

    【解决方案3】:

    为了高效排序,我认为最好从sorter_list创建字典

    sorter_dict = {x:i for i, x in enumerate(sorter_list)}
    sorted_lista = sorted(lista, key=lambda lst: sorter_dict[lst[1]])
    

    【讨论】:

      【解决方案4】:

      您可以通过构建字典在 O(N) 内完成此操作,其中您的键是 B3S2 等。

      lookup_dict = dict( (item[1],item) for item in lista)
      sorted_lista = [ lookup_dict[key] for key in sorter_list ]
      

      这利用了您的sorter_list 已经排序的事实。

      【讨论】:

        【解决方案5】:

        假设sorter_list 中总会有一个条目匹配lista 中每个列表的第二个元素:

        sorted_lista = sorted(lista, key=lambda lst: sorter_list.index(lst[1]))
        

        【讨论】:

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