Создание функции для сортировки двух списков - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь создать функцию, которая возвращает список строк, отсортированный, но с дополнительными критериями сортировки всех строк, начинающихся с / 'x' сначала.

Так, например,, список ['mix', 'xyz, 'apple', 'xanadu'] даст ['xanadu', xyz', 'apple', 'mix']

def front_x(words):
    x = []
    y = []
    for k, v in enumerate(words):
        if v.startswith("x"):
            x.append(v)
        else:
            y.append(v)

    x.sort()
    y.sort()
    print(x.extend(y))

this_list = ['mix', 'xyz', 'apple', 'xanadu', 'aardvark']

front_x(this_list)

Это дает мне вывод None.

Ответы [ 2 ]

6 голосов
/ 25 сентября 2019

Вы можете использовать sorted со следующими key:

l = ['mix', 'xyz', 'apple', 'xanadu']

sorted(l, key=lambda x: (x[0]!='x', x))
# ['xanadu', 'xyz', 'apple', 'mix']

Или, как @deepspace предлагает использовать str.startswith:

sorted(l, key=lambda s: (not s.startswith('x'), s))

Приведенный выше ключ сортирует строки на основе кортежа, состоящего из логического значения, являющегося результатом выражения x[0]!='x', и самой строки:

[(x[0]!='x', x) for x in l]
# [(True, 'mix'), (False, 'xyz'), (True, 'apple'), (False, 'xanadu')]

Отсюда и первый критерий сортировкиявляется ли строка начинается с x (имейте в виду, что False и True оцениваются как 0 и 1), а затем сама строка сортируется в алфавитно-цифровом порядке.

2 голосов
/ 25 сентября 2019

Вы можете использовать отсортированную встроенную функцию, если хотите создать другой список, но если вы не возражаете, просто измените текущий список, используйте метод list.sort :

>>> l = ['mix', 'xyz', 'apple', 'xanadu']
>>> l.sort(key=lambda s: (not s.startswith('x'), s))
>>> l
['xanadu', 'xyz', 'apple', 'mix']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...