Estoy trabajando con un diccionario que parece comportarse como una cadena en su mayor parte porque tiene comillas dobles en todo el diccionario que abarca las claves y los valores. Quiero poder indexar el diccionario, sin embargo, las marcas de voz me impiden hacerlo.

He buscado y encontrado artículos similares, pero las marcas de habla estaban en las teclas en lugar de un tamaño que abarcaba un diccionario.

Esto es lo que tengo:

{'0': {0: "{'address_components': [{'long_name': '238', 'short_name': '238', "
      "'types': ['street_number']}, {'long_name': 'Lincoln Street', "
      "'short_name': 'Lincoln St', 'types': ['route']}, {'long_name': "
      "'Hahnville', 'short_name': 'Hahnville', 'types': ['locality', "
      "'political']}, {'long_name': 'St. Charles Parish', 'short_name': "
      "'St Charles Parish', 'types': ['administrative_area_level_2', "
      "'political']}, {'long_name': 'Louisiana', 'short_name': 'LA', "
      "'types': ['administrative_area_level_1', 'political']}, "
      "{'long_name': 'United States', 'short_name': 'US', 'types': "
      "['country', 'political']}, {'long_name': '70057', 'short_name': "
      "'70057', 'types': ['postal_code']}], 'formatted_address': '238 "
      "Lincoln St, Hahnville, LA 70057, USA', 'geometry': {'bounds': "
      "{'northeast': {'lat': 29.9765067, 'lng': -90.4105124}, 'southwest': "
      "{'lat': 29.9763491, 'lng': -90.4107531}}, 'location': {'lat': "
      "29.97642, 'lng': -90.4106589}, 'location_type': 'ROOFTOP', "
      "'viewport': {'northeast': {'lat': 29.9777768802915, 'lng': "
      "-90.4092837697085}, 'southwest': {'lat': 29.9750789197085, 'lng': "
      "-90.4119817302915}}}, 'place_id': 'ChIJu32jB3_PIIYRMF2Utx14Ouc', "
      "'types': ['premise']}"}}

Y lo que he probado:

import ast
final_s = [ast.literal_eval(i) for i in p]

Lo que devuelve los resultados esperados incorrectos.

El resultado esperado debería eliminar las marcas dobles del habla:

{'0': {0: {'address_components': [{'long_name': '238', 'short_name': '238', 'types':
   ['street_number']}, {'long_name': 'Lincoln Street', 'short_name': 'Lincoln St',
   'types': ['route']}, {'long_name': 'Hahnville', 'short_name': 'Hahnville', 'types':
   ['locality', 'political']}, {'long_name': 'St. Charles Parish', 'short_name': 'St.
  Charles Parish', 'types': ['administrative_area_level_2', 'political']},
 {'long_name':   'Louisiana', 'short_name': 'LA', 'types':
 ['administrative_area_level_1',   'political']}, {'long_name': 'United States',
 'short_name': 'US', 'types': ['country',   'political']}, {'long_name': '70057',
 'short_name': '70057', 'types':   ['postal_code']}], 'formatted_address': '238 Lincoln
 St, Hahnville, LA 70057, USA',   'geometry': {'bounds': {'northeast': {'lat':
 29.9765067, 'lng': -90.4105124},   'southwest': {'lat': 29.9763491, 'lng':
 -90.4107531}}, 'location': {'lat': 29.97642,   'lng': -90.4106589}, 'location_type':
 'ROOFTOP', 'viewport': {'northeast': {'lat':   29.9777768802915, 'lng':
 -90.4092837697085}, 'southwest': {'lat': 29.9750789197085,   'lng':
 -90.4119817302915}}}, 'place_id': 'ChIJu32jB3_PIIYRMF2Utx14Ouc', 'types':
   ['premise']}}}

Y permítame indexar dentro de la lista:

p[0]
2
Stackcans 5 oct. 2021 a las 10:58

2 respuestas

La mejor respuesta

Hay 2 niveles ('0' y 0) en el diccionario anidado:

p = {
    '0':
        {
            0:
                "{'address_components': [{'long_name': '238', 'short_name': '238', 'types': ['street_number']}, {'long_name': 'Lincoln Street', 'short_name': 'Lincoln St', 'types': ['route']}, {'long_name': 'Hahnville', 'short_name': 'Hahnville', 'types': ['locality', 'political']}, {'long_name': 'St. Charles Parish', 'short_name': 'St Charles Parish', 'types': ['administrative_area_level_2', 'political']}, {'long_name': 'Louisiana', 'short_name': 'LA', 'types': ['administrative_area_level_1', 'political']}, {'long_name': 'United States', 'short_name': 'US', 'types': ['country', 'political']}, {'long_name': '70057', 'short_name': '70057', 'types': ['postal_code']}], 'formatted_address': '238 Lincoln St, Hahnville, LA 70057, USA', 'geometry': {'bounds': {'northeast': {'lat': 29.9765067, 'lng': -90.4105124}, 'southwest': {'lat': 29.9763491, 'lng': -90.4107531}}, 'location': {'lat': 29.97642, 'lng': -90.4106589}, 'location_type': 'ROOFTOP', 'viewport': {'northeast': {'lat': 29.9777768802915, 'lng': -90.4092837697085}, 'southwest': {'lat': 29.9750789197085, 'lng': -90.4119817302915}}}, 'place_id': 'ChIJu32jB3_PIIYRMF2Utx14Ouc', 'types': ['premise']}"
        }
}

import ast, pprint

for k, value in p.items():
    for sk, subValue in value.items():
        p[k][sk] = ast.literal_eval(subValue)

pprint.pprint(p)

Fuera:

{'0': {0: {'address_components': [{'long_name': '238',
                                   'short_name': '238',
                                   'types': ['street_number']},
                                  {'long_name': 'Lincoln Street',
                                   'short_name': 'Lincoln St',
                                   'types': ['route']},
                                  {'long_name': 'Hahnville',
                                   'short_name': 'Hahnville',
                                   'types': ['locality', 'political']},
                                  {'long_name': 'St. Charles Parish',
                                   'short_name': 'St Charles Parish',
                                   'types': ['administrative_area_level_2',
                                             'political']},
                                  {'long_name': 'Louisiana',
                                   'short_name': 'LA',
                                   'types': ['administrative_area_level_1',
                                             'political']},
                                  {'long_name': 'United States',
                                   'short_name': 'US',
                                   'types': ['country', 'political']},
                                  {'long_name': '70057',
                                   'short_name': '70057',
                                   'types': ['postal_code']}],
           'formatted_address': '238 Lincoln St, Hahnville, LA 70057, USA',
           'geometry': {'bounds': {'northeast': {'lat': 29.9765067,
                                                 'lng': -90.4105124},
                                   'southwest': {'lat': 29.9763491,
                                                 'lng': -90.4107531}},
                        'location': {'lat': 29.97642, 'lng': -90.4106589},
                        'location_type': 'ROOFTOP',
                        'viewport': {'northeast': {'lat': 29.9777768802915,
                                                   'lng': -90.4092837697085},
                                     'southwest': {'lat': 29.9750789197085,
                                                   'lng': -90.4119817302915}}},
           'place_id': 'ChIJu32jB3_PIIYRMF2Utx14Ouc',
           'types': ['premise']}}}
2
Maurice Meyer 5 oct. 2021 a las 08:08

Si no le preocupa la seguridad (depende de cómo adquiera esas cadenas). Puede usar el comando exec() en la cadena

Por ejemplo, si desea obtener información de su ejemplo (denominado input, puede hacer lo siguiente)

exec("real_dict="+input['0'][0])

Y ahora puede hacer lo que quiera en el real_dict como si fuera un diccionario normal.

Imprimir real_dict daría como resultado:

{'address_components': [{'long_name': '238',
   'short_name': '238',
   'types': ['street_number']},
  {'long_name': 'Lincoln Street',
   'short_name': 'Lincoln St',
   'types': ['route']},
  {'long_name': 'Hahnville',
   'short_name': 'Hahnville',
   'types': ['locality', 'political']},
  {'long_name': 'St. Charles Parish',
   'short_name': 'St Charles Parish',
   'types': ['administrative_area_level_2', 'political']},
  {'long_name': 'Louisiana',
   'short_name': 'LA',
   'types': ['administrative_area_level_1', 'political']},
  {'long_name': 'United States',
   'short_name': 'US',
   'types': ['country', 'political']},
  {'long_name': '70057', 'short_name': '70057', 'types': ['postal_code']}],
 'formatted_address': '238 Lincoln St, Hahnville, LA 70057, USA',
 'geometry': {'bounds': {'northeast': {'lat': 29.9765067, 'lng': -90.4105124},
   'southwest': {'lat': 29.9763491, 'lng': -90.4107531}},
  'location': {'lat': 29.97642, 'lng': -90.4106589},
  'location_type': 'ROOFTOP',
  'viewport': {'northeast': {'lat': 29.9777768802915,
    'lng': -90.4092837697085},
   'southwest': {'lat': 29.9750789197085, 'lng': -90.4119817302915}}},
 'place_id': 'ChIJu32jB3_PIIYRMF2Utx14Ouc',
 'types': ['premise']}

Ahora puede hacer esto con todo el diccionario de entrada con comprensión de diccionario.

0
Warkaz 5 oct. 2021 a las 08:18