将字符串键转换为字典中的 int

Posted

技术标签:

【中文标题】将字符串键转换为字典中的 int【英文标题】:Convert a string key to int in a Dictionary 【发布时间】:2014-02-07 05:49:46 【问题描述】:

我的问题与this one 非常相似,除了我有一个列表字典,并且我有兴趣将每个列表形式的键值和所有元素都更改为stringint

例如,我想要字典:

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

变成:

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

这可能吗?

因为我从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()

有没有办法在加载时直接执行?

【问题讨论】:

请注意,如果 item 无法转换为 int,int(item) 会引发错误。用try .. except 块包装它很重要,因为您正在从文件中读取,这可能有一些意想不到的值。 @vikki - 感谢您的指出。虽然我还是个初学者,还没有学习到关于异常的教程部分,但我会注意的;D 【参考方案1】:
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

值列表

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

在你的情况下:

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

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

【讨论】:

不适用于 d = '1' : ['2','3'] ...他的值是列表。 我的示例与我加载的 JSON 数据不一致。事实上,字典的每个元素都是一个列表,而不是一个单一的 int。我应该对你的建议做些什么改变? 出于某种原因coautorshipDictionary = int(k):int(v) for k,v in json.load(json_data) 对我不起作用。 JSON 已加载,但值未转换为 INT。但是,d = int(k):int(v) for k,v in d.items() 工作得很好,所以我只加载了 JSON,然后在第二步中转换为 INT。奇数。【参考方案2】:

类似于 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

这种方法的主要优点是,如果您最终得到任何嵌套字典,加载器将在加载数据时自行处理每个嵌套字典,而无需您编写代码来遍历结果字典。您还可以添加检查列表中的值不是数字字符串或列表本身也包含 dicts 的情况,如果您的 JSON 结构变得更复杂,并且如果您的数据只有列表作为*** dict 的值您可以删除 if isinstance(v, list) else v 部分。

【讨论】:

感谢您的贡献!这也回答了我关于如何以这种方式直接加载的问题的第二部分。【参考方案3】:

此解决方案适用于您将可迭代作为您的值的情况,如您提供的 json 中的值。

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

输出:

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]

对于问题的第二部分,您可以在阅读文件时使用 dict 理解。虽然它被混淆了。

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

这会产生与上面相同的输出。

【讨论】:

非常感谢您的回答,它运行良好。您知道是否有办法在加载数据时直接执行此操作? 当然,但它不漂亮。

以上是关于将字符串键转换为字典中的 int的主要内容,如果未能解决你的问题,请参考以下文章

如何将字典中的字符串值转换为 int/float 数据类型?

如何使用列表和字典将字符串转换为二进制代码

如何将字典转换为数组

将带有嵌入括号的字符串转换为字典

如何将逗号分隔的字符串转换为字符串,其中键是一个项目,值是键的长度

python中如何将字符串转换为字典