Rozważmy następujący słownik, d:
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
Chcę zwrócić pierwszy N par klucz: wartość z d (w tym przypadku N <= 4). Jaka jest najskuteczniejsza metoda zrobienia tego?
python
dictionary
Jason Strimpel
źródło
źródło
list(d.items())[:4]
. list () jest podstawową implementacją wielu odpowiedzi.Odpowiedzi:
Nie ma czegoś takiego jak „pierwsze n” kluczy, ponieważ a
dict
nie pamięta, które klucze zostały wstawione jako pierwsze.Możesz jednak uzyskać dowolne n par klucz-wartość:
Wykorzystuje to wykonanie
take
zitertools
receptur :Zobacz, jak działa online: ideone
Aktualizacja dla Pythona 3.6
źródło
iteritems
powinien zostać zastąpiony przezitems
dla ludzi w Pythonie 3take()
gdzieś częścią kodu Pythona? A może jest to wyłącznie funkcja, którą zdefiniowałeś w swojej odpowiedzi? Pytając, jakby to była część bazy kodu, nie mogę go znaleźć / zaimportować. :)Bardzo skutecznym sposobem na pobranie czegokolwiek jest połączenie wyrażeń listowych lub słownikowych z wycinaniem. Jeśli nie musisz zamawiać elementów (potrzebujesz tylko n losowych par), możesz użyć wyrażenia słownikowego w następujący sposób:
Ogólnie rzecz biorąc, takie rozumienie jest zawsze szybsze do wykonania niż jego odpowiednik w pętli „for x in y”. Ponadto, używając .keys () do tworzenia listy kluczy słownika i dzielenia tej listy, unikasz „dotykania” niepotrzebnych klawiszy podczas tworzenia nowego słownika.
Jeśli nie potrzebujesz kluczy (tylko wartości), możesz użyć rozumienia listowego:
Jeśli potrzebujesz wartości posortowanych na podstawie ich kluczy, nie stanowi to większego problemu:
lub jeśli potrzebujesz również kluczy:
źródło
Pythona
dict
nie są uporządkowane, więc nie ma sensu prosić o „pierwsze N” kluczy.collections.OrderedDict
Klasa jest dostępna, jeśli to jest to, czego potrzebujesz. Możesz skutecznie uzyskać jego pierwsze cztery elementy jakoitertools.islice
pozwala leniwie pobrać wycinek elementów z dowolnego iteratora. Jeśli chcesz, aby wynik był wielokrotnego użytku, musisz przekonwertować go na listę lub coś podobnego, na przykład:źródło
Zasadniczo zamień widok (dict_items) na iterator, a następnie wykonaj iterację za pomocą next ().
źródło
Nie widziałem tego tutaj. Nie będzie uporządkowana, ale najprostsza składniowo, jeśli potrzebujesz po prostu pobrać niektóre elementy ze słownika.
źródło
TypeError: 'dict_items' object is not subscriptable
{key:value for key,value in stocks.items()[0:n]}
pojawia się ten błąd: (akcje to nazwa mojego słownika)Aby pobrać N pierwszych elementów ze słownika Pythona, można użyć następującego wiersza kodu:
W Twoim przypadku możesz to zmienić na:
źródło
Zobacz PEP 0265 na temat sortowania słowników. Następnie użyj wyżej wymienionego kodu iterowalnego.
Jeśli potrzebujesz większej wydajności w posortowanych parach klucz-wartość. Użyj innej struktury danych. To znaczy taki, który utrzymuje posortowany porządek i skojarzenia klucz-wartość.
Na przykład
źródło
w py3, to załatwi sprawę
{'a': 3, 'b': 2, 'c': 3, 'd': 4}
źródło
po prostu dodaj odpowiedź za pomocą zip,
źródło
Zależy to od tego, co jest „najbardziej wydajne” w Twoim przypadku.
Jeśli potrzebujesz tylko pół-losowej próbki dużego słownika
foo
, użyjfoo.iteritems()
i pobierz z niego tyle wartości, ile potrzebujesz, jest to leniwa operacja, która pozwala uniknąć tworzenia jawnej listy kluczy lub elementów.Jeśli musisz najpierw posortować klucze, nie ma sposobu, aby użyć czegoś takiego jak
keys = foo.keys(); keys.sort()
lubsorted(foo.iterkeys())
, będziesz musiał utworzyć jawną listę kluczy. Następnie kawałek lub iteracji pierwszego Nkeys
.A tak przy okazji, dlaczego zależy ci na „efektywnym” sposobie? Czy profilowałeś swój program? Jeśli tego nie zrobiłeś, najpierw skorzystaj z oczywistego i łatwego do zrozumienia sposobu. Są szanse, że poradzi sobie całkiem nieźle, nie stając się wąskim gardłem.
źródło
Możesz podejść do tego na wiele sposobów. Jeśli zamówienie jest ważne, możesz to zrobić:
Jeśli zamówienie nie jest problemem, możesz to zrobić:
źródło
value
raczej nazwać niżitem
dla jasności.Słownik nie zachowuje porządku, więc przed wybraniem pierwszych N par klucz-wartość posortujmy je.
Teraz możemy pobrać górne „N” elementów:, używając struktury metody takiej jak:
aby uzyskać 2 górne elementy, po prostu użyj tej struktury:
źródło
Dla Pythona 3 i nowszych, aby wybrać pierwsze n par
źródło
rozważ dyktando
islice załatwi sprawę :) mam nadzieję, że to pomoże!
źródło
To może nie być zbyt eleganckie, ale działa dla mnie:
źródło
Wypróbowałem kilka powyższych odpowiedzi i zauważyłem, że niektóre z nich są zależne od wersji i nie działają w wersji 3.7.
Zwracam również uwagę, że od 3.6 wszystkie słowniki są uporządkowane według kolejności wstawiania pozycji.
Mimo że słowniki są zamawiane od 3.6, niektóre stwierdzenia, których oczekujesz od pracy z uporządkowanymi strukturami, wydają się nie działać.
Odpowiedź na pytanie OP, która była dla mnie najlepsza.
źródło
lst = list(d.items())[:N]
Niezwykłe podejście, ponieważ zapewnia intensywną złożoność czasu O (N).
źródło