Уведомления

Группа в Telegram: @pythonsu

#1 Июль 24, 2011 15:57:43

Kein
От:
Зарегистрирован: 2011-07-24
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

аналог ассоциативных массивов

Встала такая задача, посчитать кол-во чисел во множестве, и отсортировать их по количеству.
То есть есть список
Нужно получить

До этого я работал с PHP, и это задачу просто бы решил сделав ассоциативный массив, и отсортировав его.
Но в Python'е, если я правильно понимаю, нельзя работать так со списками(сортировать их по ключу).
Как можно решить задачу на питоне?

p.s. Если более глобально, у меня есть список чисел, и мне нужно построить гистограмму на pylab распределения количества чисел.
p.p.s изучаю питон несколько дней, пожалуйста отвечайте попроще))



Офлайн

#2 Июль 24, 2011 16:36:52

kachayev
От:
Зарегистрирован: 2011-07-08
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

аналог ассоциативных массивов

узнать кол-во уникальных:

>>> lst = [4,5,4,7,1,8,12,4,1,8]
>>> len(set(lst))
6
построить такой словарь, как ты написал под “нужно получить”:
>>> lst = [4,5,4,7,1,8,12,4,1,8]
>>> keys = {}
>>> for num in lst:
... keys.setdefault(num, 0)
... keys[num] += 1
...
>>> keys
{1: 2, 4: 3, 5: 1, 7: 1, 8: 2, 12: 1}



Офлайн

#3 Июль 24, 2011 17:16:56

Kein
От:
Зарегистрирован: 2011-07-24
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

аналог ассоциативных массивов

О, кое что узнал)
Но вот по поводу последнего.
как получить список {1: 2, 4: 3, 5: 1, 7: 1, 8: 2, 12: 1} я знал.
Но как мне получить его отсортированным по значению?



Офлайн

#4 Июль 24, 2011 17:47:33

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

аналог ассоциативных массивов

Словарь не может быть упорядоченным, за таким может быть список:

>>> import operator
>>> mydict = {1: 2, 4: 3, 5: 1, 7: 1, 8: 2, 12: 1}
>>> mylist = sorted(mydict.items(), key = operator.itemgetter(1))
>>> mylist
[(5, 1), (7, 1), (12, 1), (1, 2), (8, 2), (4, 3)]
p.s. Существуют реализации упорядоченных словарей (видел/пользовал в Twisted и Django), но насколько мне известно во второй ветке в батарейки такие словари так и небыли включены. Смотри в сторону UserDict, для самопала.

..bw



Отредактировано (Июль 24, 2011 17:50:25)

Офлайн

#5 Июль 24, 2011 19:55:59

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

аналог ассоциативных массивов

Kein
p.s. Если более глобально, у меня есть список чисел, и мне нужно построить гистограмму на pylab
- смотрите документацию
http://matplotlib.sourceforge.net/examples/api/histogram_demo.html

Еще варианты:
import itertools
[(i,len(list(j))) for (i,j) in itertools.groupby(sorted([1,1,1,2,2,3,3,5,5,5]))]



Отредактировано (Июль 24, 2011 20:09:54)

Офлайн

#6 Июль 25, 2011 12:04:23

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

аналог ассоциативных массивов

Один из самых медленных вариантов в лоб.

sorted( (k, lst.count(k)) for k in set(lst) )



Офлайн

#7 Июль 26, 2011 02:19:18

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

аналог ассоциативных массивов

Еще можно воспользоваться классом Counter из collections

from collections import Counter
Counter([4,5,4,7,1,8,12,4,1,8]).most_common()[::-1]



Офлайн

#8 Июль 26, 2011 03:37:51

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

аналог ассоциативных массивов

> Еще можно воспользоваться классом Counter из collections
“ImportError: cannot import name Counter”, а версию Python'а (2.6.6) указать слабо :-) ?

..bw



Офлайн

#9 Июль 26, 2011 10:06:05

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

аналог ассоциативных массивов

bw
ImportError: cannot import name Counter
2.7, 3.2



Офлайн

#10 Июль 28, 2011 02:36:48

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

аналог ассоциативных массивов

>>> lst = [4, 5, 4, 7, 1, 8, 12, 4, 1, 8]
>>> dct = {i: lst.count(i) for i in set(lst)}
>>> plst = [i for i in sorted(dct.items(), key=lambda i: i[1])]
>>> dct
{1: 2, 4: 3, 5: 1, 7: 1, 8: 2, 12: 1}
>>> plst
[(5, 1), (7, 1), (12, 1), (1, 2), (8, 2), (4, 3)]
>>>



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version