Я хочу сделать это, но для словаря:
"My string".lower()
Есть ли встроенная функция или я должен использовать цикл?
Я хочу сделать это, но для словаря:
"My string".lower()
Есть ли встроенная функция или я должен использовать цикл?
Вам нужно будет использовать либо цикл, либо понимание списка/генератора. Если вы хотите записать все ключи и значения в нижнем регистре, вы можете сделать это:
dict((k.lower(), v.lower()) for k,v in {'My Key':'My Value'}.iteritems())
Если вы хотите ввести только строчные ключи, вы можете сделать это:
dict((k.lower(), v) for k,v in {'My Key':'My Value'}.iteritems())
Генераторные выражения (используемые выше) часто полезны при построении словарей; Я использую их все время. Вся выразительность понимания цикла без каких-либо издержек памяти.
Следующее идентично ответу Рика Коупленда, просто написанному без использования выражения генератора:
outdict = {}
for k, v in {'My Key': 'My Value'}.iteritems():
outdict[k.lower()] = v.lower()
Генераторы-выражения, понимание списков и (в Python 2.7 и выше) - это в основном способы переписывания циклов.
В Python 2.7+ вы можете использовать понимание словаря (это одна строка кода, но вы можете переформатировать их, чтобы сделать ее более читаемой):
{k.lower():v.lower()
for k, v in
{'My Key': 'My Value'}.items()
}
Они довольно часто более аккуратные, чем эквивалент цикла, так как вам не нужно инициализировать пустой dict/list/etc.. но если вам нужно сделать что-то большее, чем один вызов функции/метода, они могут быстро стать запутанна.
Если вам нужны ключи и значения многострочного словаря (в формате json) в нижнем регистре, это может помочь. Нужно иметь поддержку для вхождения в слова, что должно быть в 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 - также поддерживает 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
ПИФОН 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
Более короткий путь в python 3: {k.lower(): v for k, v in my_dict.items()}
Если словарь содержит несколько типов ключей/значений (числовые, строковые и т.д.); затем используйте следующее решение.
Например; если у вас есть словарь с именем mydict, как показано ниже
mydict = {"FName":"John","LName":"Doe",007:true}
В 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())
В 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())
Примечание: это хорошо работает на одномерных словарях
В Python 3:
d = dict()
d = {k.casefold(): v for k, v in d.items()}
Я отвечаю на это поздно - поскольку вопрос помечен Python
.
Следовательно, отвечает с решением как для Python 2.x
, так и Python 3.x
, а также обрабатывает случай нестрочных ключей.
Python 2.x - использование словарного запаса
{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()
в 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}
В Python 3
вы можете сделать:
dict((k.lower(), v.lower()) for k,v in {'Key':'Value'}.items())
В Python 2
просто замените .items()
на .iteritems()
:
dict((k.lower(), v.lower()) for k,v in {'Key':'Value'}.iteritems())
Полюбите способ использования многоуровневых функций, здесь мой способ ввода нижнего регистра клавиш
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)
Я сначала использовал библиотеку JSON, чтобы десериализовать словарь, применить строчные буквы, чем преобразовывать обратно в словарь
import json
mydict = {'UPPERCASE': 'camelValue'}
print(mydict)
mydict_in_str = json.dumps(mydict)
mydict_lowercase = json.loads(mydict_in_str.lower())
print(mydict_lowercase)
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