代码之家  ›  专栏  ›  技术社区  ›  assertcarl

按字符串中的正斜杠数对以字符串作为值的字典进行排序

  •  1
  • assertcarl  · 技术社区  · 7 年前

    我有一本这样的字典:

    paths = {19: 'routes/web.php', 44: 'app/Http/Controllers/SearchController.php', 27: 'app/Filters/Filters.php', 32: 'resources/views/layouts/app.blade.php', 21: 'composer.json', 39: '.env'}
    
    prepared = [(key, value) for key, value in paths.items()]
    

    我想按顺序对它们进行排序,这样如果字典的值包含3个或更多的正斜杠,它们首先应该按最长的长度排序,然后按不包含任何正斜杠的值(字符串)排序,最后是包含2个或1个斜杠的值(字符串),这些斜杠按长度排序,最短的为第一个。输出应如下所示:

      prepared >>>
      [(44, 'app/Http/Controllers/SearchController.php'), (32, 'resources/views/layouts/app.blade.php'), (39, '.env'), (21, 'composer.json'), (19, 'routes/web.php'), (27, 'app/Filters/Filters.php')]
    

    1 回复  |  直到 7 年前
        1
  •  2
  •   jpp    7 年前

    sorted 使用自定义键函数生成 tuple . 您还没有指定使用ties会发生什么,因此所需的输出不匹配,并且在一般情况下没有唯一的解决方案。

    def sorter(x):
        n = x[1].count('/')
        i = -n if n >= 3 else 0
        j = 0 if n == 0 else 1
        k = n
        return i, j, k
    
    prepared = sorted(paths.items(), key=sorter)
    
    [(32, 'resources/views/layouts/app.blade.php'),
     (44, 'app/Http/Controllers/SearchController.php'),
     (21, 'composer.json'),
     (39, '.env'),
     (19, 'routes/web.php'),
     (27, 'app/Filters/Filters.php')]