Як вярнуць ключы слоўніка ў выглядзе спісу ў Python?

У Python 2.7 , я мог бы атрымаць слоўнік клавішы значэння , або элементы у выглядзе спісу:

>>> newdict = {1:0, 2:0, 3:0}
>>> newdict.keys()
[1, 2, 3]

Now, in Python >= 3.3, I get something like this:

>>> newdict.keys()
dict_keys([1, 2, 3])

Такім чынам, я павінен зрабіць гэта, каб атрымаць спіс:

newlist = list()
for i in newdict.keys():
    newlist.append(i)

Я задаюся пытаннем, ці ёсць лепшы спосаб вярнуць спіс у Python 3 ?

321
Калі вы спрабуеце разабрацца слоўнік па значэннях, паспрабуйце гэты Oneliner: спарадкаваныя (newdict.items (), ключ = лямбда х: [1]) . <�Код> newdict.items() вяртае пары ключ-значэнне як картэжаў (гэтак жа, як вы робіце з маланкай вышэй). <�Код> адсартаваны з'яўляецца убудаванай функцыяй сартавання і дазваляе <�ключ/код> параметр, які павінен быць функцыяй, якая пераўтворыць кожны элемент спісу ў значэнне, якое павінна выкарыстоўвацца для сартавання.
дададзена аўтар Chris, крыніца
Цікавае пытанне бяспекі нітка па гэтай тэме тут:
дададзена аўтар Paul, крыніца

9 адказы

Паспрабуйце спіс (newdict.keys ()) .

Гэта будзе канвертаваць dict_keys аб'екта ў спіс.

З іншага боку, вы павінны спытаць сябе, ці мае ён ці не. Шлях да Pythonic кода выказаць здагадку качка ўвод (, калі гэта выглядае як качка і кракалі як качка, гэта качка ). Элемент dict_keys аб'ект будзе дзейнічаць як спіс для большасці мэтаў. Напрыклад:

for key in newdict.keys():
  print(key)

Відавочна, што аператары ўстаўкі не могуць працаваць, але гэта не мае асаблівага сэнсу для спісу ключоў слоўніка ў любым выпадку.

403
дададзена
Гэта мае сэнс, калі ў вас ёсць да ключах прафсаюзнымі з двух dicts: спіс (набор (спіс (r1.keys ()) + спіс (r2.keys ()))) . Прынамсі, я не знайшоў лепшы спосаб.
дададзена аўтар x-yuri, крыніца
<�Код> спіс (newdict) таксама працуе (прынамсі, у пітона 3.4). Ці ёсць якая-небудзь прычына выкарыстоўваць .keys) метад (?
дададзена аўтар naught101, крыніца
@ Naught101 Так, .keys() шлях больш ясна, што адбываецца.
дададзена аўтар Felix D., крыніца
newdict.keys() не падтрымлівае індэксаванне
дададзена аўтар Miguel de Val-Borro, крыніца
Заўвага: у адладчык PDB> спіс (newdict.keys ()) не ўдаецца, таму што ён сутыкаецца з камандай PDB таго ж самага імя. Выкарыстоўвайце PDB>! Ліст (newdict.keys ()) , каб пазбегнуць PDB каманд.
дададзена аўтар Riaz Rizvi, крыніца
random.choice (newdict.keys ()) таксама не працуе!
дададзена аўтар Fardin, крыніца

Python >= 3.5 alternative: unpack into a list literal [*newdict]

Новы распакаванне абагульнення (PEP 448) былі ўведзеныя з Python 3.5 дазваляе вам прама цяпер лёгка зрабіць:

>>> newdict = {1:0, 2:0, 3:0}
>>> [*newdict]
[1, 2, 3]

Распакаванне з * працуе з любы аб'ект, які ітэрацыю, і, паколькі слоўнікі вяртаюць ключы пры ітэрацыя, вы можаце лёгка стварыць спіс, выкарыстоўваючы яго ў спісе літаральным.

Даданне .keys() т [* newdict.keys ()] можа дапамагчы ў стварэнні вашага намеры трохі больш відавочным, хоць гэта будзе каштаваць вам функцыі праглядальнаму і выклік , (Што, шчыра кажучы, гэта не тое, што вы павінны сапраўды турбуе).

<�Суб> <�Код> * ітэрацыю сінтаксіс аналагічны рабіць спіс (ітэрацыю) і яго паводзіны было першапачаткова зафіксавана ў выклікі раздзел ў Python Даведачнае кіраўніцтва. З PEP 448 абмежаванне дзе * ітэрацыю можа з'явіцца была аслаблена дазваляе яму быць таксама змешчаныя ў спіс, усталюйце і картэжаў литералы, даведачнае кіраўніцтва па спісы Expression таксама абноўленыя, каб паказаць гэта. </Суб>


Хоць эквівалентна (спіс newdict) , з той розніцай, што гэта хутчэй (прынамсі, для невялікіх слоўнікаў), таму што ні аднаго выкліку функцыі фактычна не выконваецца:

%timeit [*newdict]
1000000 loops, best of 3: 249 ns per loop

%timeit list(newdict)
1000000 loops, best of 3: 508 ns per loop

%timeit [k for k in newdict]
1000000 loops, best of 3: 574 ns per loop

з вялікімі слоўнікамі хуткасць амаль аднолькавая (накладныя выдаткі перабору вялікай калекцыі козыры невялікі кошту выкліку функцыі).


Падобным жа чынам, вы можаце стварыць наборы і наборы ключоў слоўніка:

>>> *newdict,
(1, 2, 3)
>>> {*newdict}
{1, 2, 3}

беражыцеся Коска ў выпадку картэжа!

80
дададзена
@MYounas, што сінтаксіс быў даступны на працягу некаторага часу, нават у Python 2. У функцыі выклікаў вы можаце зрабіць Абарону Foo (* Арг): друк (Арг) затым Foo (* { 1: 0, 2: 0}) з вынікам (1, 2) друкуецца. Такія паводзіны вызначаецца ў Выклікі раздзел даведачнага кіраўніцтва. Python 3.5 з PEP 448 раз прыслабіў абмежаванні на дзе яны могуць з'явіцца дазваляючы [* {1: 0, 2: 0}] , каб зараз могуць быць выкарыстаныя. У любым выпадку, я буду правіць мой адказ і ўключыць іх.
дададзена аўтар Jim Fasarakis Hilliard, крыніца
вялікі да даты адказу!
дададзена аўтар Ignacio Vergara Kausel, крыніца
вялікае тлумачэнне, але, калі ласка, вы можаце спасылацца на любую спасылку, якая апісвае гэты тып "*" newdict сінтаксісу, я маю на ўвазе, як і чаму гэта вяртае ключы з слоўніка толькі для understanding.Thanx
дададзена аўтар M Younus, крыніца
Дзякуй Людзей (у)
дададзена аўтар M Younus, крыніца

Крыху не па вызначэнні «качка тыпізацыі» - dict.keys() вяртае итератор аб'екта, а не спіс падобных аб'ектаў. Ён будзе працаваць у любым месцы итератор будзе працаваць - не любое месца спісу будзе. спіс таксама итератор, але итератор НЕ спіс (ці паслядоўнасць ...)

У рэальных спажывецкай выпадках, часцей за ўсё, што трэба зрабіць з ключамі ў Слоўніку, каб перабіраць іх, так што гэта мае сэнс. І калі вам трэба іх спіс вы можаце патэлефанаваць спіс() .

Вельмі аналагічна для паштовы індэкс() - у пераважнай большасці выпадкаў, гэта ітэрацыя - навошта ствараць ўвесь новы спіс картэжаў проста ітэрацыю праз яго, а затым выкінуць яго зноў?

Гэта частка вялікага трэнду ў пітонаў, каб выкарыстоўваць больш итераторов (і генератары), а не копіі спісаў паўсюль.

dict.keys() should work with comprehensions, though -- check carefully for typos or something... it works fine for me:

>>> d = dict(zip(['Sounder V Depth, F', 'Vessel Latitude, Degrees-Minutes'], [None, None]))
>>> [key.split(", ") for key in d.keys()]
[['Sounder V Depth', 'F'], ['Vessel Latitude', 'Degrees-Minutes']]
20
дададзена

list(newdict) works in both Python 2 and Python 3, providing a simple list of the keys in newdict. keys() isn't necessary. (:

18
дададзена
ІМХО лепшы адказ. Запіс для ўводу ў newdict: друк (я) здаюцца пераважней для г у newdict.keys (): друк (я) . <�Код> newdict.items() для перабору пар ключ-значэнне.
дададзена аўтар jolvi, крыніца
Ён робіць, але я не магу не думаць пра тое, што намер з d.keys() больш зразумела, чым са спісам (г). Ёсць шмат спосабаў, што слоўнік можа быць канвертаваны ў спіс, але пераўтварэнне інфармацыі страты ў выкананні спісу() не з'яўляецца відавочным, имо.
дададзена аўтар Jacob Lee, крыніца

Вы можаце таксама выкарыстоўваць <�моцны> спіс разуменне :

>>> newdict = {1:0, 2:0, 3:0}
>>> [k  for  k in  newdict.keys()]
[1, 2, 3]
6
дададзена

Пераўтварэнне ў спіс без выкарыстання клавішы метад робіць яго больш чытэльным:

list(newdict)

і, калі цыкл па слоўніках, няма неабходнасці клавішы() :

for key in newdict:
    print key

калі вы не змяняеце яго ў пятлі, якая запатрабуе спіс ключоў, створаных загадзя:

for key in list(newdict):
    del newdict[key]

On Python 2 there is a marginal performance gain using keys().

5
дададзена

Акрамя таго, спіс разуменне не з'яўляецца на працы:

>>> parsed_results.keys()
dict_keys(['Sounder V Depth, F', 'Vessel Latitude, Degrees-Minutes'])
>>> things2plot = [key.split(', ') for key in parsed_results.keys()]
>>> things2plot
['Sounder V Depth', 'F']
>>> for key in parsed_results.keys():
...     print(key.split(', '))
...     
['Sounder V Depth', 'F']
['Vessel Latitude', 'Degrees-Minutes']

Асабіста я лічу, што гэта «парушэнне» качынага тыпізацыі, а такім чынам, і «памылка». Але я мяркую, што хто-то павінен быў заўважыць гэта цяпер, і, такім чынам, калі ён не быў усталяваны, варта разглядаць як «асаблівасць», але я не магу за жыццё мне зразумець, чаму.

Даданне ў адказ на Крыс:

Добра, Крыс, а затым па меншай меры лепш выяўленне злоўжыванняў і апавяшчэнне ( «Вы, здаецца, не хочуць итератор тут, вы чакалі спіс Паспрабуйце спіс (dict.keys ()) ...?") Быў бы больш падобны уважлівы Python я вырас ведаць і любоў. :/(. Я б папрасіць вас дадзеныя для рэзервовага капіявання сцвярджаюць, што функцыянальнасць итератора з'яўляецца «больш распаўсюджаным» варыянт выкарыстання для dict.keys, але вы, верагодна, быць у стане паставіць яго) ;-) Што тычыцца у маім спісе разуменне прыкладу не працуе (для мяне), яно было выразаць і ўставіць з каманднага радка PyCharm адладчыка, таму, магчыма, праблема з'яўляецца памылкай у гэтым. (Я ўжо сутыкаўся іншы «памылка» у тым, што сёння, так што не здзівіла б мяне.) Дзякуй!

4
дададзена

Іншыя, чым спосабы, згаданыя на гэтай старонцы, вы можаце выкарыстоўваць itemgetter з модуля аператара:

>>> from operator import itemgetter
>>> list(map(itemgetter(0), dd.items()))
[1, 2, 3]
2
дададзена

Вы можаце таксама зрабіць картэж (Dict) або ўсталяваць (дыктуе) :

>>> list(set(newdict))
[1, 2, 3]
>>> list(tuple(newdict))
[1, 2, 3]
1
дададзена