복붙노트

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

PYTHON

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

나는 하나의 "layer"코드에서 어떤 dict을 받고있다. 어떤 계산 / 수정은 다른 "layer"로 넘어 가기 전에 수행된다. 원래 dict의 키 및 "문자열"값은 유니 코드이지만 전달되는 레이어는 str 만 허용합니다.

이것은 자주 호출 될 것이므로 다음과 같이 변환하는 가장 빠른 방법이 무엇인지 알고 싶습니다.

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

...에:

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

... "문자열"이 아닌 값은 원래 형식으로 유지해야합니다.

이견있는 사람?

해결법

  1. ==============================

    1.

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

    가정 :

    다른 컨테이너 유형을 지원해야하는 경우 패턴을 따라 가면서 패턴을 추가하는 것이 분명해지기를 바랍니다.

  2. ==============================

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

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

    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())
    
  3. ==============================

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

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

    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 } }"
    
  4. ==============================

    4.

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

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

  5. ==============================

    5.중첩되지 않은 dict의 경우 (제목에 해당 사례가 언급되지 않았기 때문에 다른 사람들에게 흥미로울 수 있음)

    중첩되지 않은 dict의 경우 (제목에 해당 사례가 언급되지 않았기 때문에 다른 사람들에게 흥미로울 수 있음)

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

    6.모든 인라인 (비 재귀 적)으로 만들려면 다음을 수행하십시오.

    모든 인라인 (비 재귀 적)으로 만들려면 다음을 수행하십시오.

    {str(k):(str(v) if isinstance(v, unicode) else v) for k,v in my_dict.items()}
    
  7. from https://stackoverflow.com/questions/1254454/fastest-way-to-convert-a-dicts-keys-values-from-unicode-to-str by cc-by-sa and MIT license