Discussion:
sortowanie zbioru słowników
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Jacek Popławski
2008-03-14 13:39:49 UTC
Permalink
Nie mogę znaleźć rozwiązania, wszędzie jest tylko o sortowaniu słowników
według klucza.

Mamy jakiś zbiór słowników:

{"a":5, "b":7, "c":12}
{"a":6, "b":3, "c":4}
{"a":2, "b":5, "c":7}

Jak posortować go wg wartości "a"? Albo według "b"? W czym trzymać
słowniki dla takiego zastosowania? W słowniku czy w liście?

Chodzi mi o rozwiązanie gotowe, bez tworzenia dodatkowego słownika z
wartościami do posortowania, tak umiem.
Piotr Keplicz
2008-03-14 13:45:29 UTC
Permalink
Post by Jacek Popławski
{"a":5, "b":7, "c":12}
{"a":6, "b":3, "c":4}
{"a":2, "b":5, "c":7}
Jak posortować go wg wartości "a"? Albo według "b"? W czym trzymać
słowniki dla takiego zastosowania? W słowniku czy w liście?
lista.sort(key=lambda x: x["a"])

.pk.
Jacek Popławski
2008-03-14 14:42:13 UTC
Permalink
Post by Piotr Keplicz
lista.sort(key=lambda x: x["a"])
Dzięki wielkie, chyba wreszcie zrozumiem do czego jest ta lambda.
Piotr Husiatyński
2008-03-14 14:51:18 UTC
Permalink
Post by Jacek Popławski
Nie mogę znaleźć rozwiązania, wszędzie jest tylko o sortowaniu słowników
według klucza.
{"a":5, "b":7, "c":12}
{"a":6, "b":3, "c":4}
{"a":2, "b":5, "c":7}
Jak posortować go wg wartości "a"? Albo według "b"? W czym trzymać
słowniki dla takiego zastosowania? W słowniku czy w liście?
Chodzi mi o rozwiązanie gotowe, bez tworzenia dodatkowego słownika z
wartościami do posortowania, tak umiem.
Słownika nie da się sortować, więc i tak będziesz musiał stworzyć
krotkę albo listę.
Jacek Popławski
2008-03-14 15:37:31 UTC
Permalink
Post by Piotr Husiatyński
Słownika nie da się sortować, więc i tak będziesz musiał stworzyć
krotkę albo listę.
Ale ja nie chcę sortować słownika, tylko ich zbiór.
Bart Ogryczak
2008-03-14 17:47:28 UTC
Permalink
Post by Jacek Popławski
Post by Piotr Husiatyński
Słownika nie da się sortować, więc i tak będziesz musiał stworzyć
krotkę albo listę.
Ale ja nie chcę sortować słownika, tylko ich zbiór.
Listę chyba, zbiorów też się nie da sortować ;-)

bart
--
"chłopcy dali z siebie wszystko, z czego tv pokazała głównie bebechy"
http://candajon.azorragarse.info/ http://azorragarse.candajon.info/
Michał Dwużnik
2008-03-15 08:20:54 UTC
Permalink
Post by Jacek Popławski
Post by Piotr Husiatyński
Słownika nie da się sortować, więc i tak będziesz musiał stworzyć
krotkę albo listę.
Ale ja nie chcę sortować słownika, tylko ich zbiór.
Sekwencję, nie zbiór.


Michał
Piotr Husiatyński
2008-03-15 08:49:47 UTC
Permalink
Post by Jacek Popławski
Nie mogę znaleźć rozwiązania, wszędzie jest tylko o sortowaniu słowników
według klucza.
{"a":5, "b":7, "c":12}
{"a":6, "b":3, "c":4}
{"a":2, "b":5, "c":7}
Jak posortować go wg wartości "a"? Albo według "b"? W czym trzymać
słowniki dla takiego zastosowania? W słowniku czy w liście?
Chodzi mi o rozwiązanie gotowe, bez tworzenia dodatkowego słownika z
wartościami do posortowania, tak umiem.
http://aspn.activestate.com/ASPN/Python/Cookbook/Recipe/52306
Jacek Popławski
2008-03-17 15:14:23 UTC
Permalink
Post by Piotr Husiatyński
http://aspn.activestate.com/ASPN/Python/Cookbook/Recipe/52306
To nie to, tam jest lambda dopiero w komentarzach.
i0cus
2008-03-18 08:00:27 UTC
Permalink
Post by Jacek Popławski
Post by Piotr Husiatyński
http://aspn.activestate.com/ASPN/Python/Cookbook/Recipe/52306
To nie to, tam jest lambda dopiero w komentarzach.
Ale do czego komu lambda? Do sortowania sekwencji można użyć dowolnego
callable. Np. z domknięcia. :)

--snip--

def byKey(key):
def selector(d):
return d[key]
return selector

x = [{"a": 1, "b": 2}, {"a":666, "b":777}]

for s in sorted(x, key=byKey("a")):
print s

for r in reversed(x, key=byKey("a")): # sorted(x, key=byKey("a"),
reversed=True)
print r

--snip--

Jaki jest plus tego rozwiązania? Np. taki, że można obsłużyć przypadek
w którym słownik może nie mieć zadanego klucza.

Można też dostarczyć komparator (argument nazwany/parametr cmp, zobacz
dokumentację).

--
pozdrawiam,
SG

Loading...