[python] 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 } }"


답변

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

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


답변

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) if isinstance(v, unicode) else v) for k,v in my_dict.items()}


답변

그냥 사용 print(*(dict.keys()))

*는 목록과 같은 컨테이너를 풀 때 사용할 수 있습니다. *에 대한 자세한 내용은 이 SO 답변을 확인하십시오 .