Сортировать словарь со строками в качестве значений по количеству косых черт в строке - PullRequest
0 голосов
/ 12 октября 2018

У меня есть словарь, подобный следующему:

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 Ответ

0 голосов
/ 12 октября 2018

Вы можете использовать sorted с пользовательской функцией клавиш, которая выдает tuple.Вы не указали, что происходит со связями, поэтому желаемый результат не совпадает, и в общем случае не существует уникального решения.

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')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...