Форум сайта python.su
0
Добрый день!
Изучаю курс: “Школа программирования | Python. Основы языка и разработки веб-приложений”
Там такое задание:
# B. Начинающиеся с X в начале # Функция принимает в качестве аргумента список строк. # Необходимо вернуть отсортированный список строк, в котором: # сначала идет группа строк, начинающихся на 'x', затем все остальные. # Например: из ['mix', 'xyz', 'apple', 'xanadu', 'aardvark'] получится # ['xanadu', 'xyz', 'aardvark', 'apple', 'mix'] # Подсказка: это можно сделать при помощи склеивания 2х заранее отсортированных списков
def front_x(words): a=[] print(words, 'words1') for i in words: if 'x' in i: a.insert(0, i) words.pop(words.index(i)) print(a, 'a') print(words, 'words2') print(sorted(a), 'a.sort') #return
Начинающиеся с X в начале (['bbb', 'ccc', 'axx', 'xzz', 'xaa'], 'words1') (['axx'], 'a') (['bbb', 'ccc', 'xzz', 'xaa'], 'words2') (['xaa', 'axx'], 'a') (['bbb', 'ccc', 'xzz'], 'words2') (['axx', 'xaa'], 'a.sort') X Получено: None | Ожидалось: ['xaa', 'xzz', 'axx', 'bbb', 'ccc'] (['ccc', 'bbb', 'aaa', 'xcc', 'xaa'], 'words1') (['xcc'], 'a') (['ccc', 'bbb', 'aaa', 'xaa'], 'words2') (['xcc'], 'a.sort') X Получено: None | Ожидалось: ['xaa', 'xcc', 'aaa', 'bbb', 'ccc'] (['mix', 'xyz', 'apple', 'xanadu', 'aardvark'], 'words1') (['mix'], 'a') (['xyz', 'apple', 'xanadu', 'aardvark'], 'words2') (['xanadu', 'mix'], 'a') (['xyz', 'apple', 'aardvark'], 'words2') (['mix', 'xanadu'], 'a.sort') X Получено: None | Ожидалось: ['xanadu', 'xyz', 'aardvark', 'apple', 'mix']
Отредактировано Imarden (Сен. 18, 2015 21:27:52)
Офлайн
24
Копайте в сторону str.startswith() и sorted. Ваша задача решается одной строкой.
Офлайн
39
Правило для новичка: нельзя изменять список по которому проходишь циклом.
Офлайн
3
Imarden
Подсказка: это можно сделать при помощи склеивания 2х заранее отсортированных списков
l = ['mix', 'xyz', 'apple', 'xanadu', 'aardvark'] l1 = [i for i in l if i[0] == 'x'] l2 = [i for i in l if i[0] != 'x'] new = l1 + l2 print new
Отредактировано Kon52 (Сен. 18, 2015 23:20:57)
Офлайн
0
Kon52
Спасибо!
Офлайн
568
l = ['mix', 'xyz', 'apple', 'xanadu', 'aardvark'] print(sorted(l, key=lambda x: x.startswith("x"), reverse=True))
Офлайн
0
FishHookПолучается
print(sorted(l, key=lambda x: x.startswith(“x”), reverse=True))
['xyz', 'xanadu', 'mix', 'apple', 'aardvark']
['xanadu', 'xyz', 'aardvark', 'apple', 'mix']
print(sorted(l, key=lambda x: x.startswith("x"))) ['mix', 'apple', 'aardvark', 'xyz', 'xanadu']
Отредактировано Imarden (Сен. 20, 2015 08:58:59)
Офлайн
568
ImardenПотому что по дефолту сортируется по возрастанию. Слова, начинающиеся на “х” самые “большие”.
Можете подсказать. Почему сортировка по ключу lambda x, содержащей первую ‘x’ помещает слова, начинающиеся на ‘x’ помещает их в конец списка?
Офлайн
568
Imarden
Получается
#!/usr/bin/env python # -* coding: utf-8 -*- l = ['mix', 'xyz', 'apple', 'xanadu', 'aardvark'] print(sorted(l, key=lambda x: (not x.startswith("x"), x)))
Офлайн
0
А что значит вот эта часть функции
(not x.startswith(“x”), x)
Если написано not, то сначала должна быть сортировка слов начинающихся не на ‘x’, а потом остальные слова.
Но на выходе вижу наоборот.
Офлайн