Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Python сортировка многомерного массива  (Прочитано 6929 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ZwS

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1674
    • Просмотр профиля
возникла предо мною такая проблема. есть папки с музыкой. каждый файл имеет название "album - artist - song.mp3". нужно вывести из этих файлов список в виде "artist - song - album" отсортировав по алфавиту без учета регистра. пока что код выглядит так:
Код: (python) [Выделить]
#!/usr/bin/python
# -*- coding: utf-8 -*-
from string import *
import sys
import os
import array

musiclist = os.listdir('/usr/user1/mp3/pop') + os.listdir('/usr/user1/mp3/rock')
c = []
for i in musiclist:
i = i.replace('.mp3', '')
b = i.split(' - ')
if i.count(' - ') == 1:
c.append([b[0], b[1], ''])
if i.count(' - ') == 2:
c.append([b[1], b[2], b[0]])
c.sort(cmp=lambda x,y: cmp(x[0],y[0]))
print '<table>'
print '<tr><th>Исполнитель</th><th>Название песни</th><th>Альбом</th></tr>'
for i in c:
print '<tr><td>'+i[0]+'</td><td>'+i[1]+'</td><td>'+i[2]+'</td></tr>'
print '</table>'
но сортировка происходит с учетом регистра. как сделать чтоб он не учитывался?
Dell Inspiron One 2330 | Intel+Radeon HD7650A | 8GB RAM | Ubuntu GNOME 17.10

Оффлайн DnSL48

  • Активист
  • *
  • Сообщений: 286
    • Просмотр профиля
Re: Python сортировка многомерного массива
« Ответ #1 : 03 Июля 2010, 15:33:47 »
c.sort(lambda x,y: -1 if x.lower() < y.lower() else x.lower() > y.lower())
« Последнее редактирование: 03 Июля 2010, 15:35:34 от DnSL48 »
ArchLinux x86_64

Оффлайн ZwS

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1674
    • Просмотр профиля
Re: Python сортировка многомерного массива
« Ответ #2 : 03 Июля 2010, 15:44:15 »
не работает
python ./songlist.py
Traceback (most recent call last):
  File "./songlist.py", line 17, in <module>
    c.sort(lambda x,y: -1 if x.lower() < y.lower() else x.lower() > y.lower())
  File "./songlist.py", line 17, in <lambda>
    c.sort(lambda x,y: -1 if x.lower() < y.lower() else x.lower() > y.lower())
AttributeError: 'list' object has no attribute 'lower'
Dell Inspiron One 2330 | Intel+Radeon HD7650A | 8GB RAM | Ubuntu GNOME 17.10

Оффлайн blindvic

  • Участник
  • *
  • Сообщений: 179
    • Просмотр профиля
Re: Python сортировка многомерного массива
« Ответ #3 : 03 Июля 2010, 16:09:12 »
Цитировать
Python lists have a built-in sort() method that modifies the list in-place and a sorted()  built-in function that builds a new sorted list from an iterable.
http://wiki.python.org/moin/HowTo/Sorting/

Цитировать
Starting with Python 2.4, both list.sort() and sorted() added a key parameter to specify a function to be called on each list element prior to making comparisons.

For example, here's a case-insensitive string comparison:

>>> sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

Оффлайн ZwS

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1674
    • Просмотр профиля
Re: Python сортировка многомерного массива
« Ответ #4 : 03 Июля 2010, 17:02:15 »
sorted(с) отрабатывает без ошибок, но сортировка не происходит. с key=str.lower не работает вообще.
посетила меня гениальная мысль. а зачем вообще мучатся с сортировкой многомерных массивов?
Код: (python) [Выделить]
#!/usr/bin/python
# -*- coding: utf-8 -*-
from string import *
import sys
import os
import array

musiclist = os.listdir('/usr/user1/mp3/pop') + os.listdir('/usr/user1/mp3/rock')
c = []
for i in musiclist:
i = i.replace('.mp3', '')
b = i.split(' - ')
if i.count(' - ') == 1:
c.append('<tr><td>'+b[0]+'</td><td>'+b[1]+'</td><td></td></tr>')
if i.count(' - ') == 2:
c.append('<tr><td>'+b[1]+'</td><td>'+b[2]+'</td><td>'+b[0]+'</td></tr>')
c.sort(key=str.lower)
print '<table>'
print '<tr><th>Исполнитель</th><th>Название песни</th><th>Альбом</th></tr>'
for i in c:
print i
print '</table>'
все сработало как задумывалось. единственное что еще интересует - python отличает символы 'S' и 'S'. наутилус же их сортирует как один и тот же. возможно ли также же сделать в питоне?
Dell Inspiron One 2330 | Intel+Radeon HD7650A | 8GB RAM | Ubuntu GNOME 17.10


Оффлайн ZwS

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1674
    • Просмотр профиля
Re: Python сортировка многомерного массива
« Ответ #6 : 04 Июля 2010, 19:51:49 »
к сожалению эти мануалы не помогли. тут чтото другое, не натуральная сортировка
Dell Inspiron One 2330 | Intel+Radeon HD7650A | 8GB RAM | Ubuntu GNOME 17.10

Оффлайн blindvic

  • Участник
  • *
  • Сообщений: 179
    • Просмотр профиля
Re: Python сортировка многомерного массива
« Ответ #7 : 04 Июля 2010, 20:55:07 »
к сожалению эти мануалы не помогли. тут чтото другое, не натуральная сортировка
Натуральную сортировку я к месту упомянул, для сортировки имен файлов типа
>>> natsorted(['Team 101', 'Team 58', 'Team 30', 'Team 1'])
['Team 1', 'Team 30', 'Team 58', 'Team 101']
Я вот первая ссылка упоминает Unicode Collation Algorithm. Там внутри есть другие ссылки.

Пользователь решил продолжить мысль 04 Июля 2010, 21:19:24:
Дай список (не больше 10) имен файлов с этими символами. Попробую и я отсортировать.
« Последнее редактирование: 04 Июля 2010, 21:19:24 от blindvic »

Оффлайн ZwS

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1674
    • Просмотр профиля
Re: Python сортировка многомерного массива
« Ответ #8 : 04 Июля 2010, 22:05:36 »
про uca я тоже почитал, и нашел один из алгоритмов. но к сожалению он не правильно отрабатывается.
примерно так происходит по нем сортировка
A

B
...
тут все нормально
...
H


I
нашел еще такой алгоритм http://code.activestate.com/recipes/576507-sort-strings-containing-german-umlauts-in-correct-/ . чтото мне подсказывает что он будет самым действенным, хоть и не самым удобным.
Dell Inspiron One 2330 | Intel+Radeon HD7650A | 8GB RAM | Ubuntu GNOME 17.10

Оффлайн blindvic

  • Участник
  • *
  • Сообщений: 179
    • Просмотр профиля
Re: Python сортировка многомерного массива
« Ответ #9 : 04 Июля 2010, 23:25:59 »
нашел еще такой алгоритм http://code.activestate.com/recipes/576507-sort-strings-containing-german-umlauts-in-correct-/ . чтото мне подсказывает что он будет самым действенным, хоть и не самым удобным.
ну, наверное, это решит проблему в твоем контексте. но:
думаю, что эта проблема встречается часто, соотвественно, должно уже существовать универсальное решение. и несложное.

Пользователь решил продолжить мысль 05 Июля 2010, 00:30:26:
еще ссылочка:
http://bytes.com/topic/python/answers/610777-sorting-strings-containing-special-characters-german-umlaute
Цитировать
The default locale is not used by default; you have to set it explicitly
>>import locale
>>locale.strcoll("Ärger", "Beere")
1
>>locale.setlocale(locale.LC_ALL, "")
'de_DE.UTF-8'
>>locale.strcoll("Ärger", "Beere")
-1

Пользователь решил продолжить мысль 04 Июля 2010, 23:37:54:
Цитировать

а это на каком языке?
« Последнее редактирование: 04 Июля 2010, 23:37:54 от blindvic »

Оффлайн ZwS

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1674
    • Просмотр профиля
Re: Python сортировка многомерного массива
« Ответ #10 : 04 Июля 2010, 23:57:35 »
а это на каком языке?
язык скорее всего японский
указание локали тоже не приводит к желаемому результату.
интересно, в си тоже такие траблы с сортировкой? может проще на чем то другом написать этот код? (пробовал PHP и Python)
Dell Inspiron One 2330 | Intel+Radeon HD7650A | 8GB RAM | Ubuntu GNOME 17.10

Оффлайн blindvic

  • Участник
  • *
  • Сообщений: 179
    • Просмотр профиля
Re: Python сортировка многомерного массива
« Ответ #11 : 05 Июля 2010, 19:26:29 »
интересно, в си тоже такие траблы с сортировкой? может проще на чем то другом написать этот код? (пробовал PHP и Python)
тебе решать, но я не думаю что ты найдешь что либо легче питона для этой цели.

 

Страница сгенерирована за 0.03 секунд. Запросов: 25.