【问题标题】:Sorting python list after template list在模板列表之后对python列表进行排序
【发布时间】:2018-04-12 02:17:36
【问题描述】:

从 Python 入手,我喜欢 :)

但我有一个小问题。

我有 2 个列表:

list_a = ['XL', 'L', '0S', '1L', '1S', '2S', 'M', '58', '52', 'XXL']

list_b = ['S', 'M', 'L', 'XL', '0S', '1S', '2S', '3S']

我想在模板列表“list_b”之后排序“list_a”

如果“list_b”中不存在,我想在最后添加它。

我想要的结果是:

['M', 'L', 'XL', '0S' ,'1S', '2S', "The rest unsorted here" ]

安德烈亚斯·H

【问题讨论】:

  • 我认为将标签与您问题中使用的主要语言一起附加通常是一种好习惯。 python-3.x 是一个不错的选择,但过于具体。要获得一些流量,请使用python 标记。
  • @AndreyTyukin 是的课程,第一次来这里,我会记住这一点:-)

标签: python python-3.x list sorting


【解决方案1】:

将第二个列表转换为将字符串映射到其索引的字典,然后使用sorted 将此字典作为key

from sys import maxsize

list_a = ['XL', 'L', '0S', '1L', '1S', '2S', 'M', '58', '52', 'XXL']
list_b = ['S', 'M', 'L', 'XL', '0S', '1S', '2S', '3S']

bDict = dict(zip(list_b, range(len(list_b))))

aSorted = sorted(list_a, key=lambda x: bDict[x] if x in bDict else maxsize)

print(aSorted)

... else maxsize 部分是密钥不在字典中的情况的后备。 maxsize 是一个非常大的系统相关整数值,它应该大于任何列表的大小。

输出:

['M', 'L', 'XL', '0S', '1S', '2S', '1L', '58', '52', 'XXL']

详细解释:

  • range(len(list_b)) 生成索引 [0, 1, 2, 3, ...] 的项目
  • zip 创建包含项目和索引的对列表:[('S', 0), ('M', 1), ...]
  • dict 转换为字典,以便您现在可以快速找到 M 的索引为 1,例如
  • lambda 是一个函数,它接受一个字符串,将其传递给 dict,如果找不到索引,则返回 maxsize
  • 按此键排序给出结果列表。

列表到字典的转换对于确保查找花费(摊销)恒定时间是必要的,而不是每次都线性重新扫描列表。

【讨论】:

    【解决方案2】:
    sorted(list_a, key=lambda x: list_b.index(x) if x in list_b else len(list_b))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 2021-12-10
      • 2013-10-12
      • 1970-01-01
      • 2023-01-11
      相关资源
      最近更新 更多