Найти - Пользователи
Полная версия: Необходимо вернуть отсортированный список строк, в котором: сначала идет группа строк, начинающихся на 'x', затем все остальные.
Начало » Python для новичков » Необходимо вернуть отсортированный список строк, в котором: сначала идет группа строк, начинающихся на 'x', затем все остальные.
1 2
Imarden
Добрый день!
Изучаю курс: “Школа программирования | 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

Для каждого элемента сделал проверку. Если в i есть буква ‘x’, то этот элемент перемещаю в новый список. Но не пойму почему - некоторые элементы не перемещались в другой список.
Вот вывод:
Начинающиеся с 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']

Где моя ошибка?
ayb
Копайте в сторону str.startswith() и sorted. Ваша задача решается одной строкой.
4kpt_III
Правило для новичка: нельзя изменять список по которому проходишь циклом.
Kon52
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




Imarden
Kon52
Спасибо!
FishHook
l = ['mix', 'xyz', 'apple', 'xanadu', 'aardvark']
print(sorted(l, key=lambda x: x.startswith("x"), reverse=True))
Imarden
FishHook
print(sorted(l, key=lambda x: x.startswith(“x”), reverse=True))
Получается
['xyz', 'xanadu', 'mix', 'apple', 'aardvark']
А надо
 ['xanadu', 'xyz', 'aardvark', 'apple', 'mix']
Первый вариант решает эту задачу.

Можете подсказать. Почему сортировка по ключу lambda x, содержащей первую ‘x’ помещает слова, начинающиеся на ‘x’ помещает их в конец списка?
print(sorted(l, key=lambda x: x.startswith("x")))
['mix', 'apple', 'aardvark', 'xyz', 'xanadu']
FishHook
Imarden
Можете подсказать. Почему сортировка по ключу lambda x, содержащей первую ‘x’ помещает слова, начинающиеся на ‘x’ помещает их в конец списка?
Потому что по дефолту сортируется по возрастанию. Слова, начинающиеся на “х” самые “большие”.
FishHook
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)))
Imarden
А что значит вот эта часть функции
(not x.startswith(“x”), x)
Если написано not, то сначала должна быть сортировка слов начинающихся не на ‘x’, а потом остальные слова.
Но на выходе вижу наоборот.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB