Development Tip

dict의 키와 값을 ʻunicode`에서`str`로 변환하는 가장 빠른 방법은 무엇입니까?

yourdevel 2020. 10. 13. 19:26
반응형

dict의 키와 값을 ʻunicode`에서`str`로 변환하는 가장 빠른 방법은 무엇입니까?


다른 "계층"으로 전달하기 전에 일부 계산 / 수정이 수행되는 코드의 "계층"에서 dict를 받고 있습니다. 원래 dict의 키와 "문자열"값은 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'}

가정 :

  • 컬렉션 모듈을 가져 왔으며 제공하는 추상 기본 클래스를 사용할 수 있습니다.
  • 기본 인코딩을 사용하여 변환하는 data.encode('utf-8')것이 좋습니다 ( str(data)명시적인 인코딩이 필요한 경우 대신 사용 ).

다른 컨테이너 유형을 지원해야하는 경우 패턴을 따르고 케이스를 추가하는 방법이 분명하기를 바랍니다.


나는 이것에 늦었다는 것을 안다.

def convert_keys_to_string(dictionary):
    """Recursively converts dictionary keys to strings."""
    if not isinstance(dictionary, dict):
        return dictionary
    return dict((str(k), convert_keys_to_string(v)) 
        for k, v in dictionary.items())

이 작업을 인라인으로 원하고 재귀 하강이 필요하지 않은 경우 다음과 같이 작동 할 수 있습니다.

DATA = { u'spam': u'eggs', u'foo': True, u'bar': { u'baz': 97 } }
print DATA
# "{ u'spam': u'eggs', u'foo': True, u'bar': { u'baz': 97 } }"

STRING_DATA = dict([(str(k), v) for k, v in data.items()])
print STRING_DATA
# "{ 'spam': 'eggs', 'foo': True, 'bar': { u'baz': 97 } }"

def to_str(key, value):
    if isinstance(key, unicode):
        key = str(key)
    if isinstance(value, unicode):
        value = str(value)
    return key, value

키와 값을 전달하고 내부 사전을 설명하기 위해 코드에 재귀를 추가합니다.


중첩되지 않은 사전의 경우 (제목에 해당 사례가 언급되어 있지 않으므로 다른 사람들에게 흥미로울 수 있음)

{str(k): str(v) for k, v in my_dict.items()}

모두 인라인 (비 재귀)으로 만들려면 :

{str(k):(str(v) if isinstance(v, unicode) else v) for k,v in my_dict.items()}

참고 URL : https://stackoverflow.com/questions/1254454/fastest-way-to-convert-a-dicts-keys-values-from-unicode-to-str

반응형