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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Насчет сложных массивов в Python 
:(
    Опции темы
Suppir
Дата 16.2.2010, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Представьте себе следующую задачу.

У нас есть массив из строк следующего вида (как бы ключ и значение):

а ~ 1
а ~ 1
а ~ 2
б ~ 6
б ~ 6
б ~ 9
c ~ 3
c ~ 3
c ~ 1

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

а: 1 (2 шт.), 2 (1 шт.)
б: 6 (2 шт.), 9 (1 шт.)
с: 3 (2 шт.), 1 (1 шт.)

Можно ли это реализовать с помощью массиов Python?
PM MAIL   Вверх
Daevaorn
Дата 16.2.2010, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Конечно можно. Только алгоритм напишите вокруг dict.
PM MAIL WWW   Вверх
powerfox
Дата 16.2.2010, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

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



Цитата(Suppir @  16.2.2010,  11:12 Найти цитируемый пост)
c ~ 3
c ~ 3
c ~ 1

Вам нужен словарь (dict), где "с" используется в качестве ключа к списку, где хранятся значения.



--------------------
user posted image
PM WWW   Вверх
Karadul
Дата 17.2.2010, 00:06 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Точнее где-то так:

dict = {}
dict[c][2] = 1
PM MAIL   Вверх
powerfox
Дата 17.2.2010, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

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



Цитата(Karadul @  17.2.2010,  01:06 Найти цитируемый пост)
Точнее где-то так:

dict = {}
dict[c][2] = 1 

Точнее не придумаешь. Если уж на глаз не видите, что код косячный, проверяйте.


--------------------
user posted image
PM WWW   Вверх
Karadul
Дата 17.2.2010, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Влом проверять, смысл в том, что индексом является комбинация из буквы и числа.


Это сообщение отредактировал(а) Daevaorn - 17.2.2010, 16:41
PM MAIL   Вверх
spSerg
Дата 18.2.2010, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как-то так?
Код

src = "а ~ 1\nа ~ 1\nа ~ 2\nб ~ 6\nб ~ 6\nб ~ 9\nc ~ 3\nc ~ 3\nc ~ 1"

midList = {}
for row in src.split('\n'):
    if not (row in midList):
        midList[row] = 0
    midList[row] += 1

endResult = {}
for (key,val) in midList.items():
    parsedKey = key.split()
    if not (parsedKey[0] in endResult):
        endResult[parsedKey[0]] = []
    endResult[parsedKey[0]].append((parsedKey[2], val))
    
for key,val in endResult.items():
    #Сортировку еще хотели
    val.sort(key=lambda x:x[1], reverse=True)
    print(key + ': ' + ','.join(['%s (%d шт.)'% x for x in val]))


Это сообщение отредактировал(а) spSerg - 18.2.2010, 11:56
PM   Вверх
Леопольд
Дата 18.2.2010, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код
#!/usr/bin/env python3

"""
>>> source = 'а ~ 1 | а ~ 1 | а ~ 2 | б ~ 6 | б ~ 6 | б ~ 9 | c ~ 3 | c ~ 3 | c ~ 1'
>>> print(process(source, splitter = '|'))
{'б': [('6', 2), ('9', 1)], 'а': [('1', 2), ('2', 1)], 'c': [('3', 2), ('1', 1)]}
"""

def process(source, splitter = '\n', delimiter = '~'):
    #парсим строку
    result = dict()
    for item in source.split(splitter):
        key, d, subKey = item.split()
        assert(d == delimiter), 'Неправельный разделитель'
        subItem = result.setdefault(key, dict())
        result[key][subKey] = subItem.setdefault(subKey, 0) + 1

    #сортируем
    for key in result:
        result[key] = sorted(result[key].items(), key = lambda x: x[1], reverse = True)

    return result

if __name__ == '__main__':
    import doctest
    doctest.testmod()


Распечатать результат в нужном формате не составит проблемы
Код
{'б': [('6', 2), ('9', 1)], 'а': [('1', 2), ('2', 1)], 'c': [('3', 2), ('1', 1)]}




Это сообщение отредактировал(а) Леопольд - 18.2.2010, 18:02


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




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


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

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