Otrzymuję dyktando z jednej „warstwy” kodu, na którym są wykonywane pewne obliczenia / modyfikacje przed przekazaniem go do innej „warstwy”. Oryginalne klucze i wartości „string” są takie unicode
, ale warstwa, do której są przekazywane, akceptuje tylko str
.
Będzie to często nazywane, więc chciałbym wiedzieć, jaki byłby najszybszy sposób na konwersję czegoś takiego:
{ u'spam': u'eggs', u'foo': True, u'bar': { u'baz': 97 } }
...do:
{ 'spam': 'eggs', 'foo': True, 'bar': { 'baz': 97 } }
... pamiętając, że wartości niebędące „ciągami znaków” muszą pozostać w swoim oryginalnym typie.
jakieś pomysły?
type(data)(map(convert, data))
zamiast tego używaszmap(convert, data)
?Wiem, że się spóźniłem:
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())
źródło
str
na intJeśli chcesz to zrobić inline i nie potrzebujesz rekursywnego zejścia, może to zadziałać:
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 } }"
źródło
{ str(key):value for key,value in data.items() }
dla niezagnieżdżonego dyktu (ponieważ tytuł nie wspomina o tym przypadku, może być interesujący dla innych osób)
{str(k): str(v) for k, v in my_dict.items()}
źródło
def to_str(key, value): if isinstance(key, unicode): key = str(key) if isinstance(value, unicode): value = str(value) return key, value
Przekaż klucz i wartość do niego, a następnie dodaj rekursję do kodu, aby uwzględnić słownik wewnętrzny.
źródło
Aby to wszystko było wbudowane (nierekurencyjne):
{str(k):(str(v) if isinstance(v, unicode) else v) for k,v in my_dict.items()}
źródło
Po prostu użyj
print(*(dict.keys()))
Znak * może służyć do rozpakowywania kontenerów np. List. Aby uzyskać więcej informacji na temat *, sprawdź tę odpowiedź SO .
źródło
>>> d = {u"a": u"b", u"c": u"d"} >>> d {u'a': u'b', u'c': u'd'} >>> import json >>> import yaml >>> d = {u"a": u"b", u"c": u"d"} >>> yaml.safe_load(json.dumps(d)) {'a': 'b', 'c': 'd'}
źródło