pyplot - Diccionario a minúsculas en Python
symbols in matplotlib (9)
Deseo hacer esto, pero para un diccionario:
"My string".lower()
¿Hay una función incorporada o debería usar un bucle?
En Python 3:
d = dict()
d = {k.casefold(): v for k, v in d.items()}
Estoy respondiendo tan tarde, ya que la pregunta está etiquetada como Python
. De ahí que responda con una solución tanto para Python 2.x
como para Python 3.x
, y también maneje el caso de claves que no sean cadenas.
Python 2.x : uso de la comprensión del diccionario
{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 - no 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()}
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}
Lo siguiente es idéntico a la respuesta de Rick Copeland, que acaba de escribirse sin utilizar una expresión generadora:
outdict = {}
for k, v in {''My Key'': ''My Value''}.iteritems():
outdict[k.lower()] = v.lower()
Las expresiones de generador, comprensión de lista y (en Python 2.7 y superior) comprensión de dict son básicamente formas de reescribir bucles.
En Python 2.7+, puede usar una comprensión de diccionario (es una sola línea de código, pero puede reformatearla para que sea más legible):
{k.lower():v.lower()
for k, v in
{''My Key'': ''My Value''}.items()
}
A menudo son más ordenadas que el equivalente de bucle, 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, pueden desordenarse rápidamente.
Me encanta la manera en que puedes usar funciones multinivel, aquí está mi forma de minúsculas de 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)
Si desea que las claves y valores del diccionario multi-anidado (formato json) en minúscula, esto podría ayudar. Necesita tener soporte para las comprensiones dict que debería ser en Python 2.7
dic = {''A'':[''XX'', ''YY'', ''ZZ''],
''B'':(u''X'', u''Y'', u''Z''),
''C'':{''D'':10,
''E'':(''X'', ''Y'', ''Z''),
''F'':{''X'', ''Y'', ''Z''}
},
''G'':{''X'', ''Y'', ''Z''}
}
PYTHON2.7 : también es compatible con OrderedDict
def _lowercase(obj):
""" Make dictionary lowercase """
if isinstance(obj, dict):
t = type(obj)()
for k, v in obj.items():
t[k.lower()] = _lowercase(v)
return t
elif isinstance(obj, (list, set, tuple)):
t = type(obj)
return t(_lowercase(o) for o in obj)
elif isinstance(obj, basestring):
return obj.lower()
else:
return obj
PYTHON 3.6
def _lowercase(obj):
""" Make dictionary lowercase """
if isinstance(obj, dict):
return {k.lower():_lowercase(v) for k, v in obj.items()}
elif isinstance(obj, (list, set, tuple)):
t = type(obj)
return t(_lowercase(o) for o in obj)
elif isinstance(obj, str):
return obj.lower()
else:
return obj
Si el diccionario suministrado tiene múltiples tipos de clave / valores (numéricos, de cadena, etc.); luego usa la siguiente solución.
Por ejemplo; si 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: esto funciona bien en diccionarios unidimensionales
Tendrá que usar un bucle o una lista / comprensión del generador. Si quiere minúsculas de 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 solo las teclas, puede hacer esto ::
dict((k.lower(), v) for k,v in {''My Key'':''My Value''}.iteritems())
Las expresiones de generador (usadas anteriormente) a menudo son útiles para construir diccionarios; Los utilizo todo el tiempo. Toda la expresividad de una comprensión de bucle sin la sobrecarga de memoria.
{k.lower(): v for k, v in my_dict.items()}
más corta en Python 3: {k.lower(): v for k, v in my_dict.items()}
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