V Pythonu 2.7 sem lahko dobil slovar ključi, vrednosti ali predmeti kot seznam:
>>> newdict = {1:0, 2:0, 3:0}
>>> newdict.keys()
[1, 2, 3]
V Pythonu 3.3 dobim nekaj takega:
>>> newdict.keys()
dict_keys([1, 2, 3])
Torej moram narediti to, da dobim seznam:
newlist = list()
for i in newdict.keys():
newlist.append(i)
Zanima me, ali obstaja boljši način za vračanje seznama v Pythonu 3?
Poskusite list(newdict.keys())
.
To bo pretvorilo objekt dict_keys
v seznam.
Po drugi strani pa se morate vprašati, ali je to pomembno ali ne. Pitonski način kodiranja je, da privzamemo račjo tipizacijo (če je videti kot raca in kikirika kot raca, je raca). Objekt dict_keys
bo za večino namenov deloval kot seznam. Na primer:
for key in newdict.keys():
print(key)
Operatorji vstavljanja seveda ne bodo delovali, vendar to za seznam ključev slovarja tako ali tako ni smiselno.
list(newdict)
deluje tako v Pythonu 2 kot v Pythonu 3 in zagotavlja preprost seznam ključev v newdict
. keys()
ni potreben. (:
Malce narobe z definicijo "račje tipkanje" -- dict.keys()
vrne iterabilni objekt in ne objekta, podobnega seznamu. Deloval bo povsod, kjer bo deloval iterabil - ne pa povsod, kjer bo deloval seznam. seznam je tudi iterabil, vendar iterabil NI seznam (ali zaporedje...).
V resničnih primerih uporabe je najpogostejša stvar, ki jo je treba narediti s ključi v dict, iteracija skozi njih, zato je to smiselno. Če jih potrebujete kot seznam, lahko pokličete list()
.
Zelo podobno velja za zip()
-- v veliki večini primerov se iterira skozi -- zakaj bi ustvarili celoten nov seznam kretnic samo zato, da bi iterirali skozi njega in ga nato spet zavrgli?
To je del velikega trenda v Pythonu, da se uporablja več iteratorjev (in generatorjev), ne pa kopij seznamov povsod.
dict.keys()
bi moralo delovati z razumevanjem, čeprav - skrbno preverite, ali je prišlo do tipkarskih napak ali česa podobnega... meni deluje dobro:
>>> 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']]