tipos pyarg_parsetuple float entrada datos convertir python json dictionary

python - float - pyarg_parsetuple



Convertir una clave de cadena a int en un diccionario (3)

Esta solución funcionará en el caso de que tenga un valor iterable como su valor, como en el json que proporcionó.

my_dict = {"0": ["1", "2", "3", "4"], "1": ["0", "2", "3", "4", "27", "94", "95", "97", "128", "217", "218", "317"], "2": ["0", "1", "3", "4", "94", "95"], "3": ["0", "1", "2", "4", "377"], "4": ["0", "1", "2", "3", "27", "28"], "5": ["6", "7", "8"], "6": ["5", "7", "8"], "7": ["5", "6", "8", "14", "23", "40", "74", "75", "76", "362", "371", "372"], "8": ["5", "6", "7", "66"], "9": ["10", "11", "12"], "10": ["9", "11", "12", "56", "130", "131"]} output_dict = {} for key, value in my_dict.iteritems(): output_dict[int(key)] = [int(item) for item in value] output_dict

Salida:

{0: [1, 2, 3, 4], 1: [0, 2, 3, 4, 27, 94, 95, 97, 128, 217, 218, 317], 2: [0, 1, 3, 4, 94, 95], 3: [0, 1, 2, 4, 377], 4: [0, 1, 2, 3, 27, 28], 5: [6, 7, 8], 6: [5, 7, 8], 7: [5, 6, 8, 14, 23, 40, 74, 75, 76, 362, 371, 372], 8: [5, 6, 7, 66], 9: [10, 11, 12], 10: [9, 11, 12, 56, 130, 131]}

Para la segunda parte de la pregunta, puede usar una comprensión de dictado en línea mientras lee el archivo. Aunque está ofuscado como el infierno.

with open(''coauthorshipGraph.txt'', ''r'') as f: json_data = { int(key) : [int(item) for item in value] for key, value in json.load(f).iteritems()} json_data

Esto produce el mismo resultado que arriba.

Mi pregunta es muy similar a esta , excepto que tengo un diccionario de listas y estoy interesado en cambiar tanto el valor clave como todos los elementos en cada string formulario de lista a int .

Así, por ejemplo, me gustaría el diccionario:

{ ''1'':[''1'', ''2'', ''3'', ''4''] , ''2'':[''1'', ''4''] , ''3'':[''43'',''176''] }

convertirse:

{ 1:[1, 2, 3, 4] , 2:[1, 4] , 3:[43,176] }

es posible?

Más en general, ya que creé este diccionario desde un archivo de formato JSON .

{"0": ["1", "2", "3", "4"], "1": ["0", "2", "3", "4", "27", "94 "," 95 "," 97 "," 128 "," 217 "," 218 "," 317 "]," 2 ": [" 0 "," 1 "," 3 "," 4 "," 94 "," 95 "]," 3 ": [" 0 "," 1 "," 2 "," 4 "," 377 "]," 4 ": [" 0 "," 1 "," 2 ", "3", "27", "28"], "5": ["6", "7", "8"], "6": ["5", "7", "8"], " 7 ": [" 5 "," 6 "," 8 "," 14 "," 23 "," 40 "," 74 "," 75 "," 76 "," 362 "," 371 "," 372 "]," 8 ": [" 5 "," 6 "," 7 "," 66 "]," 9 ": [" 10 "," 11 "," 12 "]," 10 ": [" 9 "," 11 "," 12 "," 56 "," 130 "," 131 "]}

con las siguientes instrucciones:

json_data = open("coauthorshipGraph.txt") coautorshipDictionary = json.load( json_data ) json_data.close()

¿Hay una manera de hacerlo directamente en el momento de la carga?


Similar a la respuesta de Decency, pero aprovechando el argumento object_hook :

coautorshipDictionary = json.load(json_data, object_hook=lambda d: {int(k): [int(i) for i in v] if isinstance(v, list) else v for k, v in d.items()}) # iteritems() for Python 2

La principal ventaja de este método es que, si alguna vez terminas con cualquier dicto anidado, el cargador manejará cada dictado anidado por sí solo, ya que carga los datos sin que tengas que escribir código para revisar tu dictamen de resultados. También puede agregar verificaciones en los casos en que los valores en las listas no sean cadenas numéricas o las listas también contienen dictados, si su estructura JSON se vuelve más complicada, y si sus datos solo tendrán listas como valores para su dictamen de nivel superior puede eliminar el if isinstance(v, list) else v part.


d = {''1'':''145'' , ''2'':''254'' , ''3'':''43''} d = {int(k):int(v) for k,v in d.items()} >>> d {1: 145, 2: 254, 3: 43}

para listas en valores

>>> d = { ''1'':[''1'', ''2'', ''3'', ''4''] , ''2'':[''1'', ''4''] , ''3'':[''43'',''176''] } >>> d = {int(k):[int(i) for i in v] for k,v in d.items()}

en tu caso:

coautorshipDictionary = {int(k):int(v) for k,v in json.load(json_data)}

o

coautorshipDictionary = { int(k):[int(i) for i in v] for k,v in json.load(json_data)}