【问题标题】:Sorting a list of string in python such that a specific string, if present appears first在python中对字符串列表进行排序,以便特定字符串(如果存在)首先出现
【发布时间】:2014-04-15 17:35:01
【问题描述】:

我是 python 新手,希望有人可以帮助我解决这个问题。我需要对字符串列表进行排序:

s = ['status', 'value', 'place', 'tag']

我需要以这样一种方式进行排序,使排序后的列表看起来像这样:

s_sorted = ['tag', 'place', 'status', 'value']

换句话说,特定的字符串'tag' 需要始终在前面,其余的字符串将被排序。我试图想出一个允许我这样做的比较器。但到目前为止,我还无法做到这一点。如果有人有解决此类问题的经验,如果您能分享一些想法,我将不胜感激。

【问题讨论】:

  • 我们如何知道哪个是标签?总是最后一个吗?
  • 并非如此。列表中某处的列表中有一个特定的字符串。

标签: python list sorting


【解决方案1】:
s = ['status', 'value', 'place', 'tag']
s_sorted = sorted(s, key=lambda x:(x!='tag', x))

key 生成一个元组,如果元素不是 'tag',则第一个元素为布尔值。 sort 按第一个元素排序,然后是第二个。这样tag 总是排在第一位,因为False 排在True 之前。

在剩余元素的情况下 - 不等于 'tag' - 通常在第二个元组元素上进行排序,这是对值本身的字典字符串排序。


来自sorteddocumentation

key 指定一个参数的函数,用于从每个列表元素中提取比较键:key=str.lower。默认值为None(直接比较元素)。

【讨论】:

  • 关于如何传递key 元组的文档在哪里?我找不到它。
  • 它在哪里说如果key 函数返回一个元组,它将首先比较第一个元素,然后比较第二个元素,依此类推?或者这不是它正在做的事情?
  • @Two-BitAlchemist 里面可能没有提到,但是key返回的值是用来比较的,一般来说就是元组/列表比较的工作原理。
  • 是的,就是这样。这就是元组的排序方式。类似于排序字符串首先按第一个字符排序,然后按第二个字符排序,依此类推。相同的机制。这是另一篇关于它的帖子:How does Python sort a list of tuples? 关键函数是返回一个用于排序的元组
  • 这很聪明。
【解决方案2】:

你可以这样做:

>>> s = ['status', 'value', 'place', 'tag']
>>> s.sort(key=lambda x: (x != 'tag', x))
>>> s
['tag', 'place', 'status', 'value']

这里将比较包含布尔值的元组和项目本身,对于'tag',布尔值将是False,所以它总是在前面。其余值的布尔值为True,在Python 中为True > False

【讨论】:

    【解决方案3】:

    简单的方法怎么样?

    first_item = 'tag'
    s.pop(s.index(first_item))
    s.sort()
    s.insert(0, first_item)
    

    假设first_item 在目标列表中只出现一次,上述方法可行。

    【讨论】:

    • 如果有多个'tag'字符串??虽然OP没有问它。但这种方法对我来说似乎并不好。编辑:你已经提到我没读过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    相关资源
    最近更新 更多