Mat*_*teo 32 python json dictionary
我的问题与这个问题非常相似,除了我有一个列表字典,我有兴趣将键值和每个列表形式的所有元素都更改string为int.
所以例如我喜欢这本词典:
{ '1':['1', '2', '3', '4'] , '2':['1', '4'] , '3':['43','176'] }
Run Code Online (Sandbox Code Playgroud)
成为:
{ 1:[1, 2, 3, 4] , 2:[1, 4] , 3:[43,176] }
Run Code Online (Sandbox Code Playgroud)
这可能吗?
更常见的是因为我从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"]}
按照以下说明操作:
json_data = open("coauthorshipGraph.txt")
coautorshipDictionary = json.load( json_data )
json_data.close()
Run Code Online (Sandbox Code Playgroud)
有没有办法在加载时直接做到这一点?
ndp*_*dpu 52
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}
Run Code Online (Sandbox Code Playgroud)
对于值中的列表
>>> 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()}
Run Code Online (Sandbox Code Playgroud)
在你的情况下:
coautorshipDictionary = {int(k):int(v) for k,v in json.load(json_data)}
Run Code Online (Sandbox Code Playgroud)
要么
coautorshipDictionary = {
int(k):[int(i) for i in v] for k,v in json.load(json_data)}
Run Code Online (Sandbox Code Playgroud)
类似于 Decency 的回答,但利用了这个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
Run Code Online (Sandbox Code Playgroud)
这种方法的主要优点是,如果您最终得到任何嵌套的 dict,加载器将在加载数据时自行处理每个嵌套的 dict,而您无需编写代码来遍历结果 dict。您还可以添加检查列表中的值不是数字字符串或列表本身也包含字典的情况,如果您的 JSON 结构变得更复杂,并且您的数据是否只有列表作为顶级字典的值您可以删除该if isinstance(v, list) else v部分。