Словарь в нижнем регистре в Python - PullRequest
40 голосов
/ 19 апреля 2009

Я хочу сделать это, но для словаря:

"My string".lower()

Есть ли встроенная функция или я должен использовать цикл?

Ответы [ 10 ]

73 голосов
/ 19 апреля 2009

Вам нужно будет использовать либо цикл, либо понимание списка / генератора. Если вы хотите использовать все ключи и значения в нижнем регистре, вы можете сделать это ::

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

Выражения генератора (используется выше) часто полезны при создании словарей; Я использую их все время. Вся выразительность понимания цикла без лишних затрат памяти.

14 голосов
/ 19 апреля 2009

Следующий ответ идентичен ответу Рика Коупленда, только что написанному без использования выражения генератора:

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 ... но, если вам нужно сделать что-то большее, чем один вызов функции / метода, они могут быстро стать грязный.

5 голосов
/ 24 ноября 2016

Если вам нужны ключи и значения многострочного словаря (в формате 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
4 голосов
/ 25 июля 2016

Короткий путь в питоне 3: {k.lower(): v for k, v in my_dict.items()}

2 голосов
/ 26 июня 2018

В Python 3:

d = dict()
d = {k.casefold(): v for k, v in d.items()}
2 голосов
/ 22 января 2016

Если в поставляемом словаре есть ключ / значения нескольких типов (числовые, строковые и т.д.) затем используйте следующее решение.

Например; если у вас есть словарь с именем 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())

Примечание: это хорошо работает для одномерных словарей

1 голос
/ 28 апреля 2017

Я отвечаю так поздно - так как вопрос помечен 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()}

Демо

>>> 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 - нет 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()}

Демо :

>>> 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}
0 голосов
/ 03 июня 2019

В 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())
0 голосов
/ 27 февраля 2017

Мне нравится, как вы можете использовать многоуровневые функции, вот мой способ строчных букв

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)
0 голосов
/ 11 мая 2016
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...