Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Python] Сортировка слов по длине 
V
    Опции темы
Paranorma
Дата 4.2.2007, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 1.1.2007

Репутация: 1
Всего: 1



У меня просто уже ни одной умной мысли в голове, как это правильно составить. Суть такова, что сперва в список помещаются строки, а затем сортируются в словаре по длине строки. Строки длинной в 5 символов в одной группе, строки в 10 символов в другой группе (на самом деле кол-во знаков в строке может быть любым). Мне честно говоря, не совсем понятен алгоритм, но ответ в калькуляторе Питон дожен быть таким:

{'h': 5, 'j': 10, 'v': 20}

То есть значением будет длина строки...

Я написала пока так:

Код

a = []
dict = {}
while True:
    s = raw_input(">>>")
    if not s:
        break
    a.append(s)
i = 0
while i < len(a):
    s = a[i]
    j = 0
    while j < len(s):
        c = s[j] 


Что дальше делать?

Это сообщение отредактировал(а) Kuvaldis - 4.2.2007, 00:49
PM MAIL Skype Jabber MSN   Вверх
V.A.KeRneL
  Дата 4.2.2007, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vadim A. Kazantsev
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 3.12.2006
Где: Moscow, Russia

Репутация: 7
Всего: 14



Меня вот лично такое описание задачи чё-то тока запутало!.. (Препод Paranorma'ы, притча во языцах, очевидно, постарался smile.)
Цитата(Paranorma @  4.2.2007, 00:35 Найти цитируемый пост)

{'h': 5, 'j': 10, 'v': 20}

То есть значением будет длина строки...

Это понятно, но вот что означают 'h', 'j' и 'v'? Первые символы строк, самые частые симолы в строках, что-то другое?..

==========================================================================================

Могу написать сортировку слов по длине без использования словаря, с использованием стандартной функции sort(): 
Код

# -*- coding: windows-1251 -*-

# 
# Сравнивает две строки по их длинам.
# 
def len_compare(str1, str2): 
    return (len(str1) - len(str2))

a = []

while True: 
    s = raw_input(">>>")
    if (not s): 
        break
    a.append(s)
#print a



#"""
# Преобразовываем список введённых строк в список слов.
b = " ".join(a).split()
#print b

# Собственно, сортируем список слов.
b.sort(len_compare)
print b
#"""



"""
tmp = [[str, len(str)] for str in " ".join(a).split()]
#print tmp
tmp.sort(lambda t1, t2: (t1[1] - t2[1]))
#print tmp
b = [tt[0] for tt in tmp]
print b
"""

Закомментарен ("""...""") способ более эффективный для сортировки больших списков, для сортировки которых требуется большое количество сравнений. Его экономичность заключается в однократном вычислении длины для каждого из слов.

==========================================================================================

Можно и самому сортировку написать, реализующую один из стандартных методов (пузырьком, вставками, слиянием, выбором, пирамидальная, быстрая)... В принципе, можно и гномьей, она прикольная! smile

==========================================================================================

Но если надо именно при помощи словаря, то необходимо более подробно и, главное, понятно расписать задание.


Это сообщение отредактировал(а) V.A.KeRneL - 4.2.2007, 12:17


--------------------
«C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы»
---/)/)---(\.../)---(\(\
--(':'=)---(=';'=)---(=':')
(")(")..)-(").--.(")-(..(")(")

PM MAIL IM ICQ AOL YIM MSN   Вверх
Paranorma
Дата 4.2.2007, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 1.1.2007

Репутация: 1
Всего: 1



Спасибо большое, меня препод малость ввел в заблуждение. Препод просто не так давно занялся преподаванием, а потому, не имея опыта, иногда нечетко формулирует мысли. Я сегодня у него уточнила.

Должно выглядеть так:

Введенный список: ["123", "45" "abcd", "xy", "klm"]
Результат:        { 2:["45", "xy"], 3:["123", "klm"], 4:["abcd"] }

Ключ - длинна строки, значение - список слов данной длинны.

Это сообщение отредактировал(а) Paranorma - 4.2.2007, 14:50
PM MAIL Skype Jabber MSN   Вверх
V.A.KeRneL
  Дата 4.2.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vadim A. Kazantsev
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 3.12.2006
Где: Moscow, Russia

Репутация: 7
Всего: 14



Нда, твоего бы препода...

Код

# -*- coding: windows-1251 -*-

a = []

while True: 
    s = raw_input(">>>")
    if (not s): 
        break
    a.append(s)
#print a

# Преобразовываем список введённых строк в список слов.
b = " ".join(a).split()
#print b

# Создание словаря.
d = dict()
for word in b: 
    key = len(word)
    if (not d.__contains__(key)):  # if (not key in d): 
        d[key] = [word]
    else: 
        d[key] += [word]

# Вывод результата (словаря) на экран.
print d


З.Ы. Paranorma, если ты таки хочешь когда-нибудь как-нибудь научиться хотя бы кодить (программирование — это не только кодинг), то учись юзать встроенную справку и google.com, а если нет, то так держать.


Это сообщение отредактировал(а) V.A.KeRneL - 4.2.2007, 17:42


--------------------
«C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы»
---/)/)---(\.../)---(\(\
--(':'=)---(=';'=)---(=':')
(")(")..)-(").--.(")-(..(")(")

PM MAIL IM ICQ AOL YIM MSN   Вверх
Strannik
Дата 4.2.2007, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 25.1.2007

Репутация: 1
Всего: 2



Цитата

В принципе, можно и гномьей, она прикольная!

Это что за сортировка такая? Я тоже знаю прикольную сортировку, за О(N!).
PM MAIL   Вверх
Void
Дата 4.2.2007, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 6
Всего: 173



Код
def len_compare(str1, str2): 
    return (len(str1) - len(str2))

b.sort(len_compare)

=>
Код
b.sort(key = len)



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
V.A.KeRneL
  Дата 4.2.2007, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vadim A. Kazantsev
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 3.12.2006
Где: Moscow, Russia

Репутация: 7
Всего: 14



Цитата(Strannik @  4.2.2007, 18:14 Найти цитируемый пост)

Цитата

В принципе, можно и гномьей, она прикольная!

Это что за сортировка такая? Я тоже знаю прикольную сортировку, за О(N!).

Не, гномья не крэйзи, она нормальная. Довольно новая просто, не классическая. Она работает за время O(n^2), на практике обычно немного медленнее, чем пузырьковая, хотя это уже зависит от особенностей архитектуры системы и реализации алгоритма. Отличается исключительной простотой и лаконичностью кода: 
Код

void gnomesort(int n, int ar[]) {
    int i = 0;
    
    while (i < n) {
        if (i == 0 || ar[i-1] <= ar[i]) i++;
        else {int tmp = ar[i]; ar[i] = ar[i-1]; ar[--i] = tmp;}
    }
}

Автор небезосновательно называет своё творение самым простым алгоритмом сортировки.

1-ым делом настоящие «пилоты» смотрят в Гугл )) ...
Если он ссылается на Википедию, то в неё сенепременнейше...
От неё по ссылочкам... Находим страницу изобретателя, нидерландца Dick Grune (она же была первой ссылкой в Гугле)
National Institute of Standards and Technology. Можно заглянуть и сюда, убедиться, что она стандартизирована ))
N^2 sort comparison

Цитата(Strannik @  4.2.2007, 18:14 Найти цитируемый пост)

Это что за сортировка такая? Я тоже знаю прикольную сортировку, за О(N!).

Да, и я знаю такие «алгоритмы». Но вот это уже, по-моему, действительно, глупость, потому что верхний предел сложности не ограничен и при желании можно придумывать всё более сложные алгоритмы, например за время N^N^...^N (N paз), или (((N!)!)...)!, далее можно комбинировать/композиционировать эти функции, и т.д.


Это сообщение отредактировал(а) V.A.KeRneL - 4.2.2007, 18:55


--------------------
«C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы»
---/)/)---(\.../)---(\(\
--(':'=)---(=';'=)---(=':')
(")(")..)-(").--.(")-(..(")(")

PM MAIL IM ICQ AOL YIM MSN   Вверх
Paranorma
Дата 4.2.2007, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 1.1.2007

Репутация: 1
Всего: 1



Цитата(V.A.KeRneL @ 4.2.2007,  17:37)
Нда, твоего бы препода...

Код

# -*- coding: windows-1251 -*-

a = []

while True: 
    s = raw_input(">>>")
    if (not s): 
        break
    a.append(s)
#print a

# Преобразовываем список введённых строк в список слов.
b = " ".join(a).split()
#print b

# Создание словаря.
d = dict()
for word in b: 
    key = len(word)
    if (not d.__contains__(key)):  # if (not key in d): 
        d[key] = [word]
    else: 
        d[key] += [word]

# Вывод результата (словаря) на экран.
print d


З.Ы. Paranorma, если ты таки хочешь когда-нибудь как-нибудь научиться хотя бы кодить (программирование — это не только кодинг), то учись юзать встроенную справку и google.com, а если нет, то так держать.

Всем спасибо! 
Блин! Нет, я все понимаю, конечно, просто, пожалуйста, помогите на начальных этапах. 
Есть пара вопросов:
Во-первых, что значит эта строка b = " ".join(a).split() Конкретно, что значит join?

Я тут буквально одну строку в программе поправила:


Код

key = len(word)
    if (not key in d):
        d[key] = [word]


И еще один вопрос: как сделать, что б и пробел учитывался как символ строки?

Вот пример:
Список:
["12 3", "4 5", "abcd", "xy", "klm"]
Результат:
 {2:["xy"], 3:["4 5", "klm"], 4:["12 3", "abcd"] }


Еще раз прошу меня простить и заранее всем спасибо! smile 

PM MAIL Skype Jabber MSN   Вверх
Strannik
Дата 4.2.2007, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 25.1.2007

Репутация: 1
Всего: 2



V.A.KeRnel, эту сортировку я знал, только не знал что она гномья. А так, пузырёк - 4 строчки да и вообще я почти всегда кучу пишу, для тренировки.
PM MAIL   Вверх
V.A.KeRneL
  Дата 4.2.2007, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vadim A. Kazantsev
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 3.12.2006
Где: Moscow, Russia

Репутация: 7
Всего: 14



Цитата(Paranorma @  4.2.2007, 21:45 Найти цитируемый пост)

Всем спасибо! 

Пожалуйста. smile

Цитата(Paranorma @  4.2.2007, 21:45 Найти цитируемый пост)

Блин! Нет, я все понимаю, конечно, ...

Крута-а-а!.. Научи! А то я мало, что знаю и понимаю. Чуть перефразируя известное изречение: «Единиственное, что я знаю, это то, что я нихрена не знаю. ))»

Цитата(Paranorma @  4.2.2007, 21:45 Найти цитируемый пост)

... просто, пожалуйста, помогите на начальных этапах. 

ОК. Тока заруби на носике, что эти пресловутые «начальные этапы» не могут длиться вечно. На практике они не должны затягиваться более, чем на полгода (в крайнем случае год). Далее надо уметь пользоваться документацией (естественно, большая и самая ценная её часть представлена на английском языке — современном международном и программистском профессиональном языке) и поисковиками.

Цитата(Paranorma @  4.2.2007, 21:45 Найти цитируемый пост)

что значит эта строка b = " ".join(a).split() Конкретно, что значит join?

Вот тут и надо воспользоваться Гуглом, потыкать по ссылочкам с 1-ой страницы, среди них найти что-нибудь вроде этого: 
split and join
Example from a Well House Consultants training course
SOURCE CODE

Код

>>> days = ["Monday","Tuesday","Webnesday"]
>>> all = "<br>".join(days)
>>> print all
Monday<br>Tuesday<br>Webnesday
>>>
>>> if "o" in "Melksham": print "yes"
...
>>> say = "This is a line of text"
>>> parts = say.split(" ")
>>>
>>> first, second = "Tom Smiota".split(" ")
>>> second, first = first, second
>>>
>>> print parts
['This', 'is', 'a', 'line', 'of', 'text']
>>> print first
Smiota
>>> print second
Tom

Если непонятно, то скажу, что метод sep.join(list) возвращает строку из списка слов `list', сцеплённого разделителями `sep', а метод str.split([sep]), напротив, разбивает строку `str' [по разделителю `sep'] на слова (строки).

Цитата(Paranorma @  4.2.2007, 21:45 Найти цитируемый пост)

как сделать, что б и пробел учитывался как символ строки?

Вот пример:
Список:
["12 3", "4 5", "abcd", "xy", "klm"]
Результат:
 {2:["xy"], 3:["4 5", "klm"], 4:["12 3", "abcd"] }

Так как сделат-то нужно, чтобы в списке были не слова, как в предыдущей твоей задаче, а полные введённые пользователем строки? Если так, то строки ``b = " ".join(a).split()'', как раз, и не надо, а нужно проходиться циклом по списку `a': ``for word in a: ''

Цитата(Paranorma @  4.2.2007, 21:45 Найти цитируемый пост)

Еще раз прошу меня простить и заранее всем спасибо! smile

Обращайся. smile


Это сообщение отредактировал(а) V.A.KeRneL - 5.2.2007, 09:36


--------------------
«C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы»
---/)/)---(\.../)---(\(\
--(':'=)---(=';'=)---(=':')
(")(")..)-(").--.(")-(..(")(")

PM MAIL IM ICQ AOL YIM MSN   Вверх
Strannik
Дата 4.2.2007, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 25.1.2007

Репутация: 1
Всего: 2



Цитата

Тока заруби на носике, что эти пресловутые «начальные этапы» не могут длиться вечно.

Хи, а у меня начальный этап в изучении С++ продлился 3,5дня, т.к. вчера я уже участвовал в SRM на TopCoder. Для того что бы выучить язык(программирования) нужно кроме литературы и гугла как можно больше говорить(программировать) на нём.

Добавлено @ 23:35 
V.A.KeRnel, Интересно, а почему все темы Paranorma'ы плавно переходят в наш с тобой оффтоп???

Это сообщение отредактировал(а) Strannik - 4.2.2007, 23:40
PM MAIL   Вверх
Paranorma
Дата 5.2.2007, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 1.1.2007

Репутация: 1
Всего: 1



Значит вы любители оффтопа smile на самом деле я питоном только 3 месяца балуюсь, поэтому и прошу у вас помощи так часто.
PM MAIL Skype Jabber MSN   Вверх
Paranorma
Дата 5.2.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 1.1.2007

Репутация: 1
Всего: 1



Please, help! Помогите это поправить. У меня на печать выводиться только последняя введенная строка, вместо всех введенных. Да тут именно  введенные строки уже, а не слова, как в прошлый раз.

Код

a = []
while True: 
    s = raw_input(">>>")
    if (not s): 
        break
    a.append(s)
b = " ".join(a).split()
d = dict()
for word in b: 
    key = len(word)
    if (not key in d):
        d[key] = [word]
    else: 
        d[key] += [word]
print d

PM MAIL Skype Jabber MSN   Вверх
V.A.KeRneL
Дата 5.2.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vadim A. Kazantsev
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 3.12.2006
Где: Moscow, Russia

Репутация: 7
Всего: 14



Код

a = []

while True: 
    s = raw_input(">>>")
    if (not s): 
        break
    a.append(s)

d = dict()
for line in a: 
    key = len(line)
    if (not key in d): 
        d[key] = [line]
    else: 
        d[key] += [line]

print d

Так что ли?
(Строки должны все выводиться нормально...)


Это сообщение отредактировал(а) V.A.KeRneL - 5.2.2007, 15:17


--------------------
«C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы»
---/)/)---(\.../)---(\(\
--(':'=)---(=';'=)---(=':')
(")(")..)-(").--.(")-(..(")(")

PM MAIL IM ICQ AOL YIM MSN   Вверх
Paranorma
Дата 5.2.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 1.1.2007

Репутация: 1
Всего: 1



Нижайший всем поклон smile 
PM MAIL Skype Jabber MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1653 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.