【问题标题】:sorting list with key parameter of letter 'x'带有字母“x”关键参数的排序列表
【发布时间】:2017-02-12 18:13:04
【问题描述】:

例如,我有一个列表输入。我想返回一个列表,首先按字母“x”排序,然后按字母顺序排序。我是 Python 的新手,目前正在做谷歌的 python 类。

所以输入:['abc', 'bad', 'xzx', 'xxy']

预期回报是:['xxy', 'xzx', 'abc', 'bad']

我已经尝试过的:

  • 创建一个新函数来查找列表中的每个“x”字母,但这个函数失败了;
  • 在 sorted 中使用 key 函数也失败了:(

【问题讨论】:

  • ['vas', 'acg', 'bxd'] 怎么样 - 你想要 'bxd' 首先是因为它有一个 x,还是只是“按字母顺序排列,除非字母表以 x 开头”?
  • 如果是这样,你接受的答案是错误的,因为它会在bad之前排序bxd
  • 如果您希望它按照您的描述进行操作,它不会在所有情况下都有效。这与它具有任意的副作用不同。

标签: python python-2.7 list sorting


【解决方案1】:

一个按键功能小技巧:

>>> l = ['abc', 'bad', 'xzx', 'xxy']
>>> k = lambda c: -1 if c == 'x' else ord(c)
>>> sorted(l, key=lambda s: [k(c) for c in s])
['xxy', 'xzx', 'abc', 'bad']

函数 k 在应用于 'x' 和任何其他字符 (ord) 的 unicode 点时返回 -1。由于这些 un​​icode 点(整数)反映了字符的字典顺序,并保证大于或等于 0,这确保了 'x' 将具有最低值。

key函数中的排序然后将comprehends每个字符串转换成k(c)列表中每个字符c的字符串。

【讨论】:

  • 添加了一些解释和链接。
【解决方案2】:

您可以使用key 进行排序,它将每个x 替换为比任何字母字符“更小”的字符:(如'0'

>>> lst = ['abc', 'bad', 'xzx', 'xxy']
>>> sorted(lst, key=lambda x: x.replace('x', '0'))
['xxy', 'xzx', 'abc', 'bad']

如果你只想在前面有以x 开头的字符串:

>>> lst = ['abc', 'bad', 'xzx', 'xxy']
>>> sorted(lst, key=lambda x: (x[0] != 'x', x))
['xxy', 'xzx', 'abc', 'bad']

【讨论】:

  • 但可能不止一个“x”。
  • 这将从第二个字母开始按字母顺序排序。我认为每个位置都应该首选“x”。例如你的产生['bad', 'xcx', 'xxy'],其中'xcx'出现在'xxy'之前。
  • 好的,然后我误解了“首先按字母'x',然后按字母顺序”。我已经更新了答案。
  • 您可以通过x.replace('x', chr(0)) 真正获得尽可能低的字符。但这仍然不会喜欢x而不是上述字符。
  • 但只要字符串只包含字母字符(这或多或少是问题的假设),它真的很快并且可以工作。
猜你喜欢
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 2021-09-21
  • 1970-01-01
  • 2017-11-17
相关资源
最近更新 更多