2013-08-01 15 views
5

W jaki sposób przeprowadzasz iterację na zakresie kluczy w słowniku?Jak iterować po zakresie kluczy w słowniku?

na przykład, jeśli mam następujący słownik:

{'Domain Source': 'Analyst', 'Recommend Suppress': 'N', 'Standard Error': '0.25', 'Element ID': '1.A.1.d.1', 'N': '8', 'Scale ID': 'IM', 'Not Relevant': 'n/a', 'Element Name': 'Memorization', 'Lower CI Bound': '2.26', 'Date': '06/2006', 'Data Value': '2.75', 'Upper CI Bound': '3.24', 'O*NET-SOC Code': '11-1011.00'} 

jak bym iterowaniu tylko klawisze po standardowym błędem? Idealnie chciałbym uzyskać wszystkie wartości po standardowym błędzie.

Dzięki!


Wystarczy zająć się komentarz: Wiem o iteritems(), ale kiedy próbowałem indeksowanie, zwrócił błąd: nie subscriptable. Ponadto klucz/wartości są za każdym razem w tej samej kolejności.

+0

Można iterować po klawiszach za pomocą metody iterkeys(). Przykład: [klucz dla klucza w usemict.iterkeys()]. –

+1

@ HugoCorrá To, co jest użyteczne tylko w kluczach w dyktacie, jest przechowywane w kolejności, w jakiej zostały wstawione, dlatego zobacz odpowiedź jterrace – hetepeperfan

+0

Niestety, źle mnie zrozumiałem. Teraz rozumiem znaczenie uporządkowanych v. Nieuporządkowanych słowników. – goldisfine

Odpowiedz

6

Klawisze w słowniku Python nie są w żadnej określonej kolejności.

Zamiast tego należy użyć OrderedDict.

Na przykład:

>>> d = OrderedDict([('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3')]) 

Teraz są gwarantowane klawisze mają być zwracane w kolejności:

>>> d.keys() 
['key1', 'key2', 'key3'] 

Jeśli chcesz pobrać wszystkie klucze po określonej wartości, można użyć itertools.dropwhile:

>>> import itertools 
>>> list(itertools.dropwhile(lambda k: k != 'key2', d.iterkeys())) 
['key2', 'key3'] 
2

Problem polega na tym, że słowniki języka Python są nieuporządkowane, więc nie ma sensu powtarzanie kluczy po 'Standard Error'.

2

Problem polega na tym, że słowniki są nieuporządkowane. Kiedy już to zrobisz, nie możesz polegać na kolejności przedmiotów. Więc jeśli chcesz rozwiązanie ogólne, można użyć OrderedDict

Jeśli masz już swoje dane w słowniku, można wykluczyć pierwsze dwa klucze extenso:

>>> d = {'Domain Source': 'Analyst', 'Recommend Suppress': 'N', 'Standard Error': '0.25', 'Element ID': '1.A.1.d.1', 'N': '8', 'Scale ID': 'IM', 'Not Relevant': 'n/a', 'Element Name': 'Memorization', 'Lower CI Bound': '2.26', 'Date': '06/2006', 'Data Value': '2.75', 'Upper CI Bound': '3.24', 'O*NET-SOC Code': '11-1011.00'} 
>>> [x for x in d if x not in ('Domain Source', 'Recommend Suppress')] 
['N', 'Scale ID', 'Not Relevant', 'Element Name', 'Data Value', 'Standard Error', 'Element ID', 'Lower CI Bound', 'Date', 'Upper CI Bound', 'O*NET-SOC Code'] 
+0

Potrzebujesz iteritems()? – goldisfine

2

Słownik nie przechowuje klucz/wartość pary w takiej samej kolejności, w jakiej zostały dodane ... chyba że użyto OrderedDict. Oto, jak:

entries = [('Domain Source', 'Analyst'), ('Recommend Suppress', 'N'), 
('Standard Error', '0.25'), ('Element ID', '1.A.1.d.1'), 
('N', '8'), ('Scale ID', 'IM'), ('Not Relevant', 'n/a'), 
('Element Name', 'Memorization'), ('Lower CI Bound', '2.26'), 
('Date', '06/2006'), ('Data Value', '2.75'), 
('Upper CI Bound', '3.24'), ('O*NET-SOC Code', '11-1011.00')] 

from collections import OrderedDict 
d = OrderedDict(entries) 
d.keys()[2:] 

=> ['Standard Error', 'Element ID', 'N', 'Scale ID', 'Not Relevant', 
    'Element Name', 'Lower CI Bound', 'Date', 'Data Value', 
    'Upper CI Bound', 'O*NET-SOC Code'] 
Powiązane problemy