W Pythonie 2.7 mogłem uzyskać klucze , wartości lub elementy słownika jako listę:
>>> newdict = {1:0, 2:0, 3:0}
>>> newdict.keys()
[1, 2, 3]
Teraz w Pythonie> = 3.3 otrzymuję coś takiego:
>>> newdict.keys()
dict_keys([1, 2, 3])
Więc muszę to zrobić, aby uzyskać listę:
newlist = list()
for i in newdict.keys():
newlist.append(i)
Zastanawiam się, czy jest lepszy sposób na zwrócenie listy w Pythonie 3 ?
python
python-3.x
list
dictionary
python-2.x
Dimitris Fasarakis Hilliard
źródło
źródło
Odpowiedzi:
Spróbować
list(newdict.keys())
.Spowoduje to konwersję
dict_keys
obiektu do listy.Z drugiej strony powinieneś zadać sobie pytanie, czy to ma znaczenie, czy nie. Pythoński sposób kodowania polega na zakładaniu pisania kaczki ( jeśli wygląda jak kaczka i kwacze jak kaczka, to jest kaczka ). W
dict_keys
większości przypadków obiekt będzie działał jak lista. Na przykład:Oczywiście operatory wstawiania mogą nie działać, ale i tak nie ma to większego sensu dla listy kluczy słowników.
źródło
list(newdict)
działa również (przynajmniej w Pythonie 3.4). Czy jest jakiś powód, aby użyć tej.keys()
metody?pdb> list(newdict.keys())
nie działa, ponieważ koliduje z poleceniem pdb o tej samej nazwie. Służypdb> !list(newdict.keys())
do zmiany komend pdb..keys()
jest bardziej jasne, co się dzieje.Python> = 3.5 alternatywa: rozpakuj do literału listy
[*newdict]
Nowe uogólnienia dotyczące rozpakowywania (PEP 448) zostały wprowadzone w Pythonie 3.5, umożliwiając łatwe wykonywanie:
Rozpakowywanie za pomocą
*
działa z każdym obiektem, który można iterować, a ponieważ słowniki zwracają klucze podczas iteracji, możesz łatwo utworzyć listę, używając jej w literale listy.Dodanie
.keys()
np.[*newdict.keys()]
Może pomóc w uczynieniu twojej intencji nieco bardziej wyraźną, chociaż będzie to kosztowało wyszukiwanie funkcji i wywoływanie. (co, szczerze mówiąc , nie powinieneś się tym martwić).*iterable
Składnia jest podobna do robienialist(iterable)
, a jego zachowanie było początkowo udokumentowane w sekcji Połączenia podręcznika Python Reference. W przypadku PEP 448 zlikwidowano ograniczenie dotyczące miejsca, w którym*iterable
może się pojawić, pozwalając na umieszczenie go również w literałach list, set i krotkach, zaktualizowano również podręcznik referencyjny list wyrażeń .Jest to równoważne
list(newdict)
z tą różnicą, że jest szybsze (przynajmniej w przypadku małych słowników), ponieważ w rzeczywistości nie jest wykonywane żadne wywołanie funkcji:w przypadku większych słowników prędkość jest prawie taka sama (narzut związany z iteracją przez dużą kolekcję przewyższa niewielki koszt wywołania funkcji).
W podobny sposób możesz tworzyć krotki i zestawy kluczy słownika:
uważaj na końcowy przecinek w krotce!
źródło
def foo(*args): print(args)
a następnie wydrukowaćfoo(*{1:0, 2:0})
wynik(1, 2)
. To zachowanie jest określone w sekcji Połączenia podręcznika referencyjnego. Python 3.5 z PEP 448 właśnie poluzował ograniczenia dotyczące tego, gdzie mogą się pojawiać, umożliwiając[*{1:0, 2:0}]
teraz ich użycie. Tak czy inaczej, zmienię odpowiedź i dołączę je.*newdict
- to zdecydowanie odpowiedź dla golfistów kodowych; P. Ponadto: co, szczerze mówiąc, nie jest czymś, o co powinieneś się martwić - a jeśli tak, nie używaj Pythona .list(newdict)
działa zarówno w Python 2, jak i Python 3, zapewniając prostą listę kluczy wnewdict
.keys()
nie jest konieczne. (:źródło
Nieco w definicji „typowania kaczki” -
dict.keys()
zwraca obiekt powtarzalny, a nie obiekt podobny do listy. Będzie działać wszędzie, gdzie będzie działał iterowalny - nie w żadnym miejscu listy. lista jest także iterowalna, ale iterowalna NIE jest listą (lub sekwencją ...)W rzeczywistych przypadkach użycia, najczęstszą rzeczą związaną z kluczami w nagraniu jest iteracja przez nie, więc ma to sens. A jeśli potrzebujesz ich jako listy, możesz zadzwonić
list()
.Bardzo podobnie, ponieważ
zip()
- w zdecydowanej większości przypadków jest iterowana - po co tworzyć nową listę krotek, aby ją powtarzać, a następnie wyrzucić?Jest to część dużego trendu w Pythonie, aby używać większej liczby iteratorów (i generatorów), a nie kopii list w całym miejscu.
dict.keys()
powinien jednak działać ze zrozumieniem - dokładnie sprawdź literówki lub coś ... działa dla mnie dobrze:źródło
.keys()
; słownik obiekt jest sama iterable i produkuje klucze kiedy powtórzyć nad:[key.split(", ") for key in d]
.Możesz także skorzystać ze zrozumienia listy :
Lub krócej
Uwaga: Zamówienie nie jest gwarantowane w wersjach poniżej 3.7 (zamawianie to nadal tylko szczegół implementacji w CPython 3.6).
źródło
list(newdict)
. Nie ma tu potrzeby rozumienia listy.Konwersja na listę bez korzystania z
keys
metody czyni ją bardziej czytelną:a podczas przeglądania pętli słowników nie ma potrzeby
keys()
:chyba że modyfikujesz go w pętli, co wymagałoby wcześniej utworzonej listy kluczy:
W Pythonie 2 użycie marginalnego przyrostu wydajności jest niewielkie
keys()
.źródło
Jeśli potrzebujesz przechowywać klucze osobno, oto rozwiązanie, które wymaga mniej pisania niż każde inne przedstawione do tej pory rozwiązanie, używając Extended Iterable Unpacking (python3.x +).
źródło
k
zawsze jest tutaj lista. Jeśli użytkownik chce krotkę lub zestaw z kluczy, musi wrócić do innych opcji.*k, = d
ma ograniczenia dotyczące miejsca, w którym może się pojawić (ale zobacz, a może zaktualizuj tę odpowiedź, PEP 572 - rozszerzone rozpakowywanie nie jest obsługiwane dla wyrażeń przypisania atm, ale może być kiedyś! )keys, vals = zip(*d.items())
(chociaż daje to dwie krotki, wystarczająco blisko). Nie znam krótszego wyrazu niż ten.Mogę wymyślić 2 sposoby wydobywania kluczy ze słownika.
Metoda 1: - Aby uzyskać klucze za pomocą metody .keys (), a następnie przekonwertować na listę.
Metoda 2: - Aby utworzyć pustą listę, a następnie dołączyć do niej klucze za pomocą pętli. Możesz również uzyskać wartości za pomocą tej pętli (użyj .keys () tylko dla kluczy i .items () zarówno dla wydobycia kluczy, jak i wartości)
źródło