Найти - Пользователи
Полная версия: аналог ассоциативных массивов
Начало » Python для новичков » аналог ассоциативных массивов
1 2
Kein
Встала такая задача, посчитать кол-во чисел во множестве, и отсортировать их по количеству.
То есть есть список
Нужно получить

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

p.s. Если более глобально, у меня есть список чисел, и мне нужно построить гистограмму на pylab распределения количества чисел.
p.p.s изучаю питон несколько дней, пожалуйста отвечайте попроще))
kachayev
узнать кол-во уникальных:
>>> 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}
Kein
О, кое что узнал)
Но вот по поводу последнего.
как получить список {1: 2, 4: 3, 5: 1, 7: 1, 8: 2, 12: 1} я знал.
Но как мне получить его отсортированным по значению?
bw
Словарь не может быть упорядоченным, за таким может быть список:
>>> 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
doza_and
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]))]
Isem
Один из самых медленных вариантов в лоб.
sorted( (k, lst.count(k)) for k in set(lst) )
pyuser
Еще можно воспользоваться классом Counter из collections
from collections import Counter
Counter([4,5,4,7,1,8,12,4,1,8]).most_common()[::-1]
bw
> Еще можно воспользоваться классом Counter из collections
“ImportError: cannot import name Counter”, а версию Python'а (2.6.6) указать слабо :-) ?

..bw
pyuser
bw
ImportError: cannot import name Counter
2.7, 3.2
py.user.next
>>> 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)]
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB