Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Python для новичков
  • » Необходимо вернуть отсортированный список строк, в котором: сначала идет группа строк, начинающихся на 'x', затем все остальные. [RSS Feed]

#1 Сен. 18, 2015 21:26:27

Imarden
Зарегистрирован: 2015-02-20
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Необходимо вернуть отсортированный список строк, в котором: сначала идет группа строк, начинающихся на 'x', затем все остальные.

Добрый день!
Изучаю курс: “Школа программирования | 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']

Где моя ошибка?

Отредактировано Imarden (Сен. 18, 2015 21:27:52)

Офлайн

#2 Сен. 18, 2015 21:33:53

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Необходимо вернуть отсортированный список строк, в котором: сначала идет группа строк, начинающихся на 'x', затем все остальные.

Копайте в сторону str.startswith() и sorted. Ваша задача решается одной строкой.

Офлайн

#3 Сен. 18, 2015 21:35:21

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Необходимо вернуть отсортированный список строк, в котором: сначала идет группа строк, начинающихся на 'x', затем все остальные.

Правило для новичка: нельзя изменять список по которому проходишь циклом.

Офлайн

#4 Сен. 18, 2015 23:20:09

Kon52
Зарегистрирован: 2015-01-31
Сообщения: 66
Репутация: +  3  -
Профиль   Отправить e-mail  

Необходимо вернуть отсортированный список строк, в котором: сначала идет группа строк, начинающихся на 'x', затем все остальные.

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)

Офлайн

#5 Сен. 19, 2015 19:34:37

Imarden
Зарегистрирован: 2015-02-20
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Необходимо вернуть отсортированный список строк, в котором: сначала идет группа строк, начинающихся на 'x', затем все остальные.

Kon52
Спасибо!

Офлайн

#6 Сен. 19, 2015 20:53:05

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Необходимо вернуть отсортированный список строк, в котором: сначала идет группа строк, начинающихся на 'x', затем все остальные.

l = ['mix', 'xyz', 'apple', 'xanadu', 'aardvark']
print(sorted(l, key=lambda x: x.startswith("x"), reverse=True))



Офлайн

#7 Сен. 20, 2015 08:40:51

Imarden
Зарегистрирован: 2015-02-20
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Необходимо вернуть отсортированный список строк, в котором: сначала идет группа строк, начинающихся на 'x', затем все остальные.

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']

Отредактировано Imarden (Сен. 20, 2015 08:58:59)

Офлайн

#8 Сен. 20, 2015 09:11:51

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Необходимо вернуть отсортированный список строк, в котором: сначала идет группа строк, начинающихся на 'x', затем все остальные.

Imarden
Можете подсказать. Почему сортировка по ключу lambda x, содержащей первую ‘x’ помещает слова, начинающиеся на ‘x’ помещает их в конец списка?
Потому что по дефолту сортируется по возрастанию. Слова, начинающиеся на “х” самые “большие”.



Офлайн

#9 Сен. 20, 2015 09:17:15

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Необходимо вернуть отсортированный список строк, в котором: сначала идет группа строк, начинающихся на 'x', затем все остальные.

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)))



Офлайн

#10 Сен. 20, 2015 09:21:11

Imarden
Зарегистрирован: 2015-02-20
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Необходимо вернуть отсортированный список строк, в котором: сначала идет группа строк, начинающихся на 'x', затем все остальные.

А что значит вот эта часть функции
(not x.startswith(“x”), x)
Если написано not, то сначала должна быть сортировка слов начинающихся не на ‘x’, а потом остальные слова.
Но на выходе вижу наоборот.

Офлайн

  • Начало
  • » Python для новичков
  • » Необходимо вернуть отсортированный список строк, в котором: сначала идет группа строк, начинающихся на 'x', затем все остальные.[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version