다른 “계층”으로 전달하기 전에 일부 계산 / 수정이 수행되는 코드의 “계층”에서 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()}