2015-05-15 9 views

risposta

17

Creiamo un semplice OrderedDict:

>>> from collections import OrderedDict 
>>> od = OrderedDict(enumerate("abcdefg")) 
>>> od 
OrderedDict([(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f'), (6, 'g')]) 

Per tornare i primi tre chiavi, valori o articoli rispettivamente:

>>> list(od)[:3] 
[0, 1, 2] 
>>> list(od.values())[:3] 
['a', 'b', 'c'] 
>>> list(od.items())[:3] 
[(0, 'a'), (1, 'b'), (2, 'c')] 

Per rimuovere tutto tranne le prime tre voci:

>>> while len(od) > 3: 
...  od.popitem() 
... 
(6, 'g') 
(5, 'f') 
(4, 'e') 
(3, 'd') 
>>> od 
OrderedDict([(0, 'a'), (1, 'b'), (2, 'c')]) 
+0

'.items()' e '.values ​​()' restituisce liste (almeno in Python 2.7) quindi non c'è bisogno di usare 'list()'. È diverso in Python 3? – John

+0

@John [Sì] (https://docs.python.org/3/library/stdtypes.html#dict-views). Ho scelto di non complicare la risposta menzionando che nelle liste 2.x vengono restituiti: non c'è alcun impatto pratico qui, e in ogni caso, tutti dovrebbero scrivere con 3.x in mente (anche se il loro codice non è ancora bersaglio). –

+0

Vale la pena notare che 'OrderedDict (list (od.items()) [: 3])' restituirà un dict con solo i primi tre elementi in un one-liner. – cjbarth

2

non è diverso da altri dicts:

d = OrderedDict({ x: x for x in range(10) }) 

i = d.iteritems() 
a = next(i) 
b = next(i) 
c = next(i) 

d = OrderedDict([a,b,c]) 
# or 
d.clear() 
d.update([a,b,c]) 
3

È possibile utilizzare questo metodo iterativo per ottenere il lavoro fatto.

x = 0 
for i in ordered_dict: 
    if x > 3: 
     del ordered_dict[i] 
    x += 1 

In primo luogo, basta fare una variabile contatore, x, e assegnare a 0. Poi scorrere le chiavi in ​​ordered_dict. Vedete quanti elementi sono stati controllati vedendolo x è maggiore di 3, che è il numero di valori che volete. Se 3 articoli sono già stati controllati, è possibile effettuare il prelievo da del e da quello ordered_dict.


Ecco un pulitore, metodo alternativo (grazie alle osservazioni)

for i, k in enumerate(ordered_dict): 
    if i > 2: 
     del ordered_dict[k] 

Questo funziona utilizzando enumerare per assegnare un numero a ciascun tasto. Quindi controlla se quel numero è inferiore a due (0, 1 o 2). Se il numero non è 0, 1 o 2 (questi saranno i primi tre elementi), quell'elemento nel dizionario verrà eliminato.

+0

Ah, vedo dove stai andando con quello. Colpa mia. Potresti usare 'enumerate' qui invece. – kindall

+0

Nvm, ma si, enumerare è meglio. – Shashank

+0

Qualcosa del genere: 'per i, k in enumerate (odct): if i> 2: del odct [k]' Ovviamente, non su una riga perché si tratta di un errore di sintassi: p – Shashank

Problemi correlati