83 votes

Le moyen le plus rapide de convertir les clés et les valeurs d'un dict de `unicode` en` str`?

Je suis la réception d'une dict à partir d'une "couche" de code sur lequel certains calculs et des modifications sont effectuées avant de la passer sur une autre "couche". L'original dict clés & "chaîne de valeurs" sont unicode, mais la couche qu'ils sont passés à seulement accepte str.

Cela va être appelé souvent, donc j'aimerais savoir quel serait le moyen le plus rapide pour convertir quelque chose comme:

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

...à:

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

...en tenant compte de la non-"chaîne de valeurs" besoin de rester aussi leur type d'origine.

Toutes les pensées?

156voto

RichieHindle Points 98544
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'}

Hypothèses:

  • Vous avez déjà importé les collections module et peuvent utiliser les classes de base abstraites qu'il fournit
  • Vous êtes heureux de le convertir en utilisant le codage par défaut (utiliser data.encode('utf-8') plutôt que d' str(data) si vous avez besoin d'un codage explicite).

Si vous avez besoin de l'appui d'autres types de conteneurs, j'espère que c'est évident pour vous de suivre le modèle et ajouter des cas pour eux.

25voto

Germano Points 1042

Je sais je suis en retard sur celui-ci:

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())

12voto

Samuel Clay Points 597

Si vous voulais le faire en ligne et qu'il n'avait pas besoin de descente récursive, cela peut fonctionner:

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

3voto

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

passer de la clé et de la valeur, et ajouter de la récursivité à votre code de compte à l'intérieur de dictionnaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X