Python根据给定的顺序对列表进行排序

fxy*_*fxy 11 python sorting list

说,我有一个清单A = [[3,5],[1,3],[6,1]].

我说还有另一份清单 B = [6,1,3]

我想对列表A进行排序,以便A变为[[6,1],[1,3],[3,5]],适合给定的BIe,每个A子列表的第一个成员应该根据B进行排序.

Pau*_*ney 15

派生一个dict,将B中的数字映射到它们的索引,并在排序键函数中使用它.这样,您可以保持按键功能的恒定时间.

>>> A = [[3,5],[1,3],[6,1]]
>>> B = [6,1,3]
>>> srt = {b: i for i, b in enumerate(B)}
>>> sorted(A, key=lambda x: srt[x[0]])
[[6, 1], [1, 3], [3, 5]]
Run Code Online (Sandbox Code Playgroud)

这段代码肯定有一些注意事项.如果重复一个数字,B您将获得排序中使用的最后一个条目的索引.

此外,如果A中的条目与B中不匹配,则表示您有KeyError.你可以通过使用dict.get一些默认值来缓解这种情况,但是如果您的输入数据一开始就搞砸了,那么错误是一件好事.

  • 一份命令,一种复杂!好吧,各有各的。传统上,否决意味着答案是错误的(或无用的),而这两者都不是。通常最好有一系列可能的答案,这是建议使用此方法的唯一答案。 (2认同)

Cor*_*mer 9

您可以查找每个[0]元素A使用位于.indexB

>>> sorted(A, key = lambda i: B.index(i[0]))
[[6, 1], [1, 3], [3, 5]]
Run Code Online (Sandbox Code Playgroud)

或就地排序

>>> A.sort(key = lambda i: B.index(i[0]))
>>> A
[[6, 1], [1, 3], [3, 5]]
Run Code Online (Sandbox Code Playgroud)

  • `list.index`在这里真的不是很有效...... (8认同)
  • 如果你喜欢缓慢而低效的代码,这是一个很好的答案. (6认同)
  • @cᴏʟᴅsᴘᴇᴇᴅ你可以自由地提出另一种选择:)这是我在阅读问题和撰写答案之间的6分钟内出现的问题.如果速度是一个很大的交易,那么就可以进行优化 (5认同)