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

{'Publisher': u'TSR', 'Language': u'en', 'Title': u'The Silent Blade', 'Authors': [u'R. A. Salvatore'], 'ISBN-13': u'9780786913886', 'Year': u'1998'}

{'Publisher': u'Houghton Mifflin Harcourt', 'Language': u'en', 'Title': u'A Field Guide To Mushrooms, North America', 'Authors': [u'Kent H. McKnight', u'Roger Tory Peterson', u'Vera B. McKnight'], 'ISBN-13': u'9780395910900', 'Year': u'1998'}

Обратите внимание, что второй вариант имеет несколько авторов, поэтому список в словаре. Я все еще новичок в Python, и это держало меня на ногах много ночей. Кажется, я не могу понять, как получить к ним доступ. Я могу изменить случай ключевого случая с этим

book_data = {k.lower(): v for k, v in book_data.items()} #keys
book_data = {v.lower(): k for k, v in book_data.items()} #values

Но я попытался изменить это от ключей к значениям и просто поместить их обратно, но это не сработало в списке во втором примере. Каков наилучший способ перебора всего словаря и использования строчных букв в качестве значений? Большинство моих поисков просто возвращают меняя регистр ключей.

1
scott 28 Май 2017 в 19:34

2 ответа

Лучший ответ

Я бы определил функцию для рекурсивного нижнего регистра значения, а затем использовал бы его в понимании слова:

import types
def lowerValues(arg):
    # Handle iterables
    if hasattr(arg, "__iter__"):
        return [lowerValues(item) for item in arg]
    elif isinstance(arg, types.StringTypes):
        return arg.lower()
    else:
        return arg

book_data = {k.lower() : lowerValues(v) for k,v in book_data.items()}
1
Mureinik 28 Май 2017 в 16:42

Сделайте все это за один шаг:

Book_data = {k.lower (): str (v) .lower () для k, v в dict.items ()}

1
Mario Valadez Trevino 15 Май 2019 в 15:58