2009-04-18 13 views
34

Deseo hacer esto, pero para un diccionario:a minúsculas en Python

"My string".lower() 

¿Existe una función integrada o debería utilizar un bucle?

+0

para las llaves, los valores, o ambos? – hasen

+0

para ambos – Teifion

Respuesta

64

Necesitará utilizar un bucle o una lista/comprensión del generador. Si desea minúsculas todas las claves y valores, puede hacer esto ::

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

Si desea minúsculas sólo las teclas, se puede hacer esto ::

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

Generator expressions (utilizado anteriormente) son a menudo útiles en la construcción de diccionarios; Los utilizo todo el tiempo. Toda la expresividad de una comprensión de bucle sin la sobrecarga de memoria.

+1

Esto supone que las claves son cadenas. Si tiene un valor numérico como clave, fallará. – lorenzog

+2

'dict.iteritems()' se elimina de Python 3, en su lugar usa 'dict.items()'. –

+0

Para Python 3 la respuesta de Damio: http://stackoverflow.com/a/4223871/674648 – Delblanco

13

El siguiente es idéntica a la respuesta de Rick Copeland, acaba de escribir sin expresión generadora usando:

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

generador de expresiones, lista por comprensión de y (en Python 2.7 y superior) comprensión dict de son básicamente formas de reescritura de bucles .

En Python 2.7+, se puede utilizar un diccionario por comprensión (es una sola línea de código, pero se puede cambiar el formato de ellos para que sea más legible):

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

Son muy a menudo más ordenado que el bucle equivalente, ya que no tiene que inicializar un dict/list/etc vacío, pero, si necesita hacer algo más que una única llamada a función/método, puede convertirse rápidamente en un desastre.

+4

+1 para comprensión dict. – Stephan202

+0

¿cómo generalizar esto para un caso donde el diccionario tiene más de una clave y> 1 valor para cada clave? – user1993

2

Si el diccionario suministrado tiene varios tipos de clave/valores (numéricos, de cadena, etc.); luego usa la siguiente solución.

Por ejemplo; si usted tiene un diccionario llamado mydict como se muestra a continuación

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

En 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()) 

En 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: este funciona bien en diccionarios unidimensionales

+0

En este punto, simplemente haría una función más baja que hace el control. 'try_lower = lambda k: k.lower() si esinstancia (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 forma en Python 3:{k.lower(): v for k, v in my_dict.items()}

0

Si quieres claves y valores del diccionario anidada (formato JSON) en minúsculas, esto podría ayudar. Necesita tener soporte para las comprensiones dict que debe estar en 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

encanta la forma en que puede utilizar las funciones de varios niveles, aquí está mi forma de minúsculas-ing las teclas

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

estoy respondiendo a estas alturas - como la cuestión se marca Python. Respondiendo con una solución tanto para Python 2.x como para Python 3.x, y también manejando la caja de llaves que no son de cadena.

Python 2.x - utilizando el diccionario comprensión

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

demostración:

>>> 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 - sin iteritems() en 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()} 

demostración:

>>> 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} 
Cuestiones relacionadas