【问题标题】:customized sorting using search term in django在 django 中使用搜索词进行自定义排序
【发布时间】:2020-02-07 09:13:10
【问题描述】:

我正在 dict 列表中搜索术语“john”,

我有一个这样的字典列表:

"response": [
    {
        "name": "Alex T John"
    },
    {
        "name": "Ajo John"
    },
    {
        "name": "John",

    }]

我正在使用:

response_query = sorted(response, key = lambda i: i['name']) 

response_query 只返回结果的升序,但我需要一个以名字为优先级的结果。

预期结果:

    {
        "name": "John"
    },
    {
        "name": "Ajo John"
    },
    {
        "name": "Alex T John",

    }

应该首先出现包含搜索词的名字。

【问题讨论】:

  • 会使用sorted(response, key = lambda i: i['name'].index('John')) 吗?
  • 你怎么知道名字的哪一部分代表名字?或者你要问的只是sorted(..., reverse=True)
  • @Shinratensei 但它的显示结果像 John Cap , John Dio , John.But 它应该像 John,John Cap , John Dio
  • sorted(response, key = lambda i: i['name'].index('John') + len(i['name'])),但我觉得你有很多条件,这个 lambda 最终可能无法读取,你应该实现一个更慢但更准确排序的方法

标签: django sorting django-rest-framework


【解决方案1】:

如果您需要按优先级排序,可以尝试返回元组的键函数。在您的特定情况下,据我所知,此功能可以正常工作:

response_query = sorted(
    response,
    key=lambda i: (len(i['name'].split()) > 1, i['name'])
)

换句话说,如果name 仅包含一个单词,我添加了返回False 的条件len(i['name'].split()) > 1(它将首先出现),否则True

对于这种情况,如果您需要优先条件,因为name 以您在搜索中使用的术语开头,结果将是:

term = 'john'
...
response_query = sorted(
    response,
    key=lambda i: (not i['name'].lower().startswith(term), i['name'])
)

【讨论】:

  • 所以,请在您的问题中澄清您的首要任务是什么意思。由一个单词或以您要查找的单词或其他任何单词开头的名称组成的名称。我发现您的问题不够清楚,无法回答。
  • 由一个单词组成的名称
  • 所以我建议的工作正常。它还会返回您需要的结果。
  • 通过使用您的代码,该术语包含首先出现的姓氏。
  • 我的结果 : John , Abraham T John , John C
猜你喜欢
  • 1970-01-01
  • 2017-11-09
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
相关资源
最近更新 更多