Python 2.7:ssä sain sanakirjan avaimet, arvot tai kohteet listana:
>>> newdict = {1:0, 2:0, 3:0}
>>> newdict.keys()
[1, 2, 3]
Nyt Python >= 3.3:ssa saan jotain tällaista:
>>> newdict.keys()
dict_keys([1, 2, 3])
Minun on siis tehtävä näin saadakseni luettelon:
newlist = list()
for i in newdict.keys():
newlist.append(i)
Ihmettelen, onko olemassa parempi tapa palauttaa lista Python 3:ssa?
Kokeile list(newdict.keys())
.
Tämä muuntaa dict_keys
-olion listaksi.
Toisaalta sinun kannattaa kysyä itseltäsi, onko sillä väliä. Pythonilainen tapa koodata on olettaa ankkatyypitys (jos se näyttää ankalta ja kukkoilee kuin ankka, se on ankka). dict_keys
-olio toimii useimmissa tarkoituksissa kuin lista. Esimerkiksi:
for key in newdict.keys():
print(key)
On selvää, että lisäysoperaattorit eivät välttämättä toimi, mutta siinä ei ole muutenkaan paljon järkeä sanakirjan avainten luettelolle.
Hieman väärässä "ankan kirjoittaminen" määritelmässä -- dict.keys()
palauttaa iterable-olion, ei listamaista objektia. Se toimii missä tahansa missä iteroitava toimii -- ei missään missä lista toimii. lista on myös iteroitava, mutta iteroitava EI ole lista (tai sekvenssi...).
Todellisissa käyttötapauksissa tavallisin asia, joka tehdään dictin avaimilla, on niiden iterointi, joten tämä on järkevää. Ja jos tarvitset niitä listana, voit kutsua list()
.
Samoin zip()
:n kohdalla - suurimmassa osassa tapauksia se käydään läpi - miksi luoda kokonainen uusi tupleluettelo vain käydäkseen sen läpi ja heittääksesi sen sitten taas pois?
Tämä on osa pythonin suurta trendiä käyttää enemmän iteraattoreita (ja generaattoreita) sen sijaan, että kopioidaan listoja kaikkialle.
dict.keys()
:n pitäisi kuitenkin toimia käsitteiden kanssa - tarkista tarkkaan, ettei siinä ole kirjoitusvirheitä tai jotain... se toimii minulla hyvin:
>>> 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']]