关于python:如何将字典中的字符串值更改为int值

how to change string values in dictionary to int values

我有一本字典,比如:

1
{'Sun': {'Satellites': 'Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune,Ceres,Pluto,Haumea,Makemake,Eris', 'Orbital Radius': '0', 'Object': 'Sun', 'RootObject': 'Sun', 'Radius': '20890260'}, 'Earth': {'Period': '365.256363004', 'Satellites': 'Moon', 'Orbital Radius': '77098290', 'Radius': '63710.41000.0', 'Object': 'Earth'}, 'Moon': {'Period': '27.321582', 'Orbital Radius': '18128500', 'Radius': '1737000.10', 'Object': 'Moon'}}

我想知道如何将数值改为int而不是字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def read_next_object(file):    
        obj = {}              
        for line in file:      
                if not line.strip(): continue
                line = line.strip()                        
                key, val = line.split(":")                
                if key in obj and key =="Object":
                        yield obj                      
                        obj = {}                              
                obj[key] = val

        yield obj              

planets = {}                  
with open("smallsolar.txt", 'r') as f:
        for obj in read_next_object(f):
                planets[obj["Object"]] = obj    

print(planets)


不要只是将值添加到字典obj[key] = val中,而是首先检查该值是否应存储为float。我们可以通过使用regular expression匹配来实现这一点。

1
2
3
4
if re.match('^[0-9.]+$',val):  # If the value only contains digits or a .
    obj[key] = float(val)      # Store it as a float not a string
else:
    obj[key] = val             # Else store as string

注意:您需要导入python正则表达式模块re,方法是将此行添加到脚本顶部:import re

可能在这里浪费了一些0's1's,但请阅读:

  • python教程

  • python数据类型

  • 导入python模块

  • 正则表达式howto with python

  • 停止尝试"获取teh codez",开始尝试开发你的问题解决和编程能力,否则你只能做到这一步。


    我怀疑这是基于你以前的问题。如果是这样的话,在你把"轨道半径"放进字典之前,你应该考虑去解释它的值。我在那篇文章上的回答实际上是为你做的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    elif line.startswith('Orbital Radius'):

        # get the thing after the":".
        # This is the orbital radius of the planetary body.
        # We want to store that as an integer. So let's call int() on it
        rad = int(line.partition(":")[-1].strip())

        # now, add the orbital radius as the value of the planetary body in"answer"
        answer[obj] = rad

    但是,如果您真的想在创建字典后处理字典中的数字,可以使用以下方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    def intify(d):
        for k in d:
            if isinstance(d[k], dict):
                intify(d[k])
            elif isinstance(d[k], str):
                if d[k].strip().isdigit():
                    d[k] = int(d[k])
                elif all(c.isdigit() or c=='.' for c in d[k].strip()) and d[k].count('.')==1:
                    d[k] = float(d[k])

    希望这有帮助


    1
    2
    s = '12345'
    num = int(s) //num is 12345


    如果这是一个一级递归dict,如您的示例中所示,则可以使用:

    1
    2
    3
    4
    5
    6
    for i in the_dict:
        for j in the_dict[i]:
            try:
                the_dict[i][j] = int (the_dict[i][j])
            except:
                pass

    如果它是任意递归的,则需要更复杂的递归函数。既然你的问题似乎与此无关,我就不举一个例子。