1. ホーム
  2. python

[解決済み] dict のキーと値を `unicode` から `str` に変換する最速の方法とは?

2023-06-01 23:28:49

質問

ある層からdictを受け取り、それを別の層に渡す前に計算や変更を行います。元のdictのキーとquot;文字列の値は次のとおりです。 unicode ですが、渡されるレイヤーは str .

これは頻繁に呼び出されることになるので、次のようなものを変換する最も速い方法を知りたいのです。

{ u'spam': u'eggs', u'foo': True, u'bar': { u'baz': 97 } }

...する。

{ 'spam': 'eggs', 'foo': True, 'bar': { 'baz': 97 } }

...非"文字列"値は、それらの元の型のままである必要があることに留意してください。

何か考えはありますか?

どのように解決するのですか?

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'}

前提条件

  • collections モジュールをインポートし、それが提供する抽象的な基本クラスを利用することができる。
  • デフォルトのエンコーディングを使用して変換することに満足している ( data.encode('utf-8') ではなく str(data) を使用します)。

他のコンテナタイプをサポートする必要がある場合、パターンに従ってそれらのためのケースを追加する方法が明らかであることを望みます。