2009-04-18 12 views

risposta

64

Sarà necessario utilizzare un ciclo o una lista/generatore di comprensione. Se si desidera in minuscolo tutte le chiavi e valori, si può fare questo ::

dict((k.lower(), v.lower()) for k,v in {'My Key':'My Value'}.iteritems()) 

Se si desidera in minuscolo solo le chiavi, si può fare questo ::

dict((k.lower(), v) for k,v in {'My Key':'My Value'}.iteritems()) 

Generator expressions (utilizzato in precedenza) sono spesso utili nella costruzione di dizionari; Li uso sempre. Tutta l'espressività di una comprensione del ciclo con nessun sovraccarico di memoria.

+1

Questo presuppone che le chiavi siano stringhe. Se si ha un valore numerico come chiave, fallirà. – lorenzog

+2

'dict.iteritems()' viene rimosso da Python 3, invece usa 'dict.items()'. –

+0

Per la risposta di Python 3 damio: http://stackoverflow.com/a/4223871/674648 – Delblanco

13

Il seguente è identica alla risposta di Rick Copeland, appena scritto senza un generatore di espressione utilizzando:

outdict = {} 
for k, v in {'My Key': 'My Value'}.iteritems(): 
    outdict[k.lower()] = v.lower() 

generatore di espressioni, di lista di e (in Python 2.7 e superiori) dict comprensione di sono fondamentalmente modi di riscrittura loop .

In Python 2.7+, è possibile utilizzare una comprensione dizionario (si tratta di una sola riga di codice, ma è possibile riformattare loro per renderlo più leggibile):

{k.lower():v.lower() 
    for k, v in 
    {'My Key': 'My Value'}.items() 
} 

Essi sono spesso più ordinato rispetto al ciclo equivalente, in quanto non è necessario inizializzare un ditt/elenco vuoto/ecc., ma, se è necessario fare qualcosa di più di una singola chiamata funzione/metodo, possono rapidamente diventare disordinati.

+4

+1 per la comprensione del ditt. – Stephan202

+0

come generalizzare questo per un caso in cui il dizionario ha più di una chiave e> 1 valori per ogni chiave? – user1993

2

Se il dizionario fornito ha più tipi di chiavi/valori (numerico, stringa ecc.); quindi utilizzare la seguente soluzione.

Ad esempio; se si dispone di un dizionario di nome mydict come illustrato di seguito

mydict = {"FName":"John","LName":"Doe",007:true} 

In Python 2.x

dict((k.lower() if isinstance(k, basestring) else k, v.lower() if isinstance(v, basestring) else v) for k,v in mydict.iteritems()) 

In Python 3.x

dict((k.lower() if isinstance(k, str) else k, v.lower() if isinstance(v, str) else v) for k,v in mydict.iteritems()) 

Nota: questo funziona bene su dizionari monodimensionali

+0

A questo punto vorrei solo eseguire una funzione più bassa che esegue il controllo. 'try_lower = lambda k: k.lower() se isinstance (k, str) else k' –

-1
def convert_to_lower_case(data): 
    if type(data) is dict: 
     for k, v in data.iteritems(): 
      if type(v) is str: 
       data[k] = v.lower() 
      elif type(v) is list: 
       data[k] = [x.lower() for x in v] 
      elif type(v) is dict: 
       data[k] = convert_to_lower_case(v) 
    return data 
3

Shorter modo in Python 3:{k.lower(): v for k, v in my_dict.items()}

0

Se volete chiavi e valori del dizionario nidificato (formato JSON) minuscolo, questo potrebbe aiutare. È necessario avere il supporto per la comprensione del ditt che cosa dovrebbe essere in Python 2 .7

def _lowercase(obj): 
     """ Make dictionary lowercase """ 
     if isinstance(obj, dict): 
      return {k.lower():_lowercase(v) for k, v in obj.iteritems()} 
     elif isinstance(obj, list): 
      return [_lowercase(k) for k in obj] 
     elif isinstance(obj, basestring): 
      return obj.lower() 
     else: 
      return obj 
0

amore il modo in cui è possibile utilizzare le funzioni multilivello, ecco il mio modo di minuscole-ing i tasti

def to_lower(dictionary): 

    def try_iterate(k): 
     return lower_by_level(k) if isinstance(k, dict) else k 

    def try_lower(k): 
     return k.lower() if isinstance(k, str) else k 

    def lower_by_level(data): 
     return dict((try_lower(k), try_iterate(v)) for k, v in data.items()) 

    return lower_by_level(dictionary) 
1

sto rispondendo così tardi - come la questione è aggiunto Python. Quindi rispondere con una soluzione per entrambi Python 2.x e Python 3.x e gestire anche il caso di chiavi non stringa.

Python 2.x - utilizzando il dizionario comprensione

{k.lower() if isinstance(k, basestring) else k: v.lower() if isinstance(v, basestring) else v for k,v in yourDict.iteritems()} 

Demo:

>>> yourDict = {"Domain":"WORKGROUP", "Name": "CA-LTP-JOHN", 111: 'OK', "Is_ADServer": 0, "Is_ConnectionBroker": 0, "Domain_Pingable": 0} 
>>> {k.lower() if isinstance(k, basestring) else k: v.lower() if isinstance(v, basestring) else v for k,v in yourDict.iteritems()} 
{'domain': 'workgroup', 'name': 'ca-ltp-john', 'is_adserver': 0, 'is_connectionbroker': 0, 111: 'ok', 'domain_pingable': 0} 

Python 3.x - non iteritems() in Python 3.x

{k.lower() if isinstance(k, str) else k: v.lower() if isinstance(v, str) else v for k,v in yourDict.items()} 

Demo:

>>> dict((k.lower() if isinstance(k, basestring) else k, v.lower() if isinstance(v, basestring) else v) for k,v in yourDict.iteritems()) 
Traceback (most recent call last): 
    File "python", line 1, in <module> 
AttributeError: 'dict' object has no attribute 'iteritems' 
>>> {k.lower() if isinstance(k, str) else k: v.lower() if isinstance(v, str) else v for k,v in yourDict.items()} 
>>> {'domain': 'workgroup', 'name': 'ca-ltp-john', 111: 'ok', 'is_adserver': 0, 'is_connectionbroker': 0, 'domain_pingable': 0} 
Problemi correlati