Самый быстрый способ преобразовать ключи dict и значения от 'unicode' до 'ул.'?

Первая книга операционных систем Tenenbaum. Мой первый взгляд на программирование уровня ядра.

77
задан Phillip B Oldham 10 August 2009 в 11:51
поделиться

2 ответа

DATA = { u'spam': u'eggs', u'foo': frozenset([u'Gah!']), u'bar': { u'baz': 97 },
         u'list': [u'list', (True, u'Maybe'), set([u'and', u'a', u'set', 1])]}

def convert(data):
    if isinstance(data, basestring):
        return str(data)
    elif isinstance(data, collections.Mapping):
        return dict(map(convert, data.iteritems()))
    elif isinstance(data, collections.Iterable):
        return type(data)(map(convert, data))
    else:
        return data

print DATA
print convert(DATA)
# Prints:
# {u'list': [u'list', (True, u'Maybe'), set([u'and', u'a', u'set', 1])], u'foo': frozenset([u'Gah!']), u'bar': {u'baz': 97}, u'spam': u'eggs'}
# {'bar': {'baz': 97}, 'foo': frozenset(['Gah!']), 'list': ['list', (True, 'Maybe'), set(['and', 'a', 'set', 1])], 'spam': 'eggs'}

Допущения:

  • Вы импортировали модуль коллекций и можете использовать абстрактные базовые классы, которые он предоставляет
  • Вы счастливы преобразовать, используя кодировку по умолчанию (используйте data.encode ('utf-8') вместо str (data) , если вам нужна явная кодировка).

Если вам нужна поддержка других типов контейнеров, надеюсь, очевидно, как следовать шаблону и добавлять для них футляры.

147
ответ дан 24 November 2019 в 10:50
поделиться
def to_str(key, value):
    if isinstance(key, unicode):
        key = str(key)
    if isinstance(value, unicode):
        value = str(value)
    return key, value

передать ключ и значение к нему и добавить рекурсию в свой код для учета внутреннего словаря.

3
ответ дан 24 November 2019 в 10:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: