0

我有一本字典,例如:

{'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'}}

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

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

4 回答 4

2

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

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 

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

可能会浪费一些0's1's阅读以下内容:

  1. Python 教程

  2. Python 数据类型

  3. 导入 Python 模块

  4. 正则表达式 HOWTO 与 python

停止尝试'get teh codez'并开始尝试发展你的问题解决和编程能力,否则你只会到目前为止......

于 2012-11-23T21:29:59.480 回答
1
s = '12345'
num = int(s) //num is 12345
于 2012-11-23T21:14:13.797 回答
1

我怀疑这是基于您之前的问题。如果是这种情况,您应该考虑在将“轨道半径”的值放入字典之前将其输入。我在那个帖子上的回答实际上是为你做的:

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

但是,如果您真的想在创建字典后处理字典中的数字,您可以这样做:

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

希望这可以帮助

于 2012-11-23T21:16:53.553 回答
0

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

for i in the_dict:
    for j in the_dict[i]:
        try:
            the_dict[i][j] = int (the_dict[i][j])
        except:
            pass

如果它是任意递归的,您将需要一个更复杂的递归函数。由于您的问题似乎与此无关,因此我不会为此提供示例。

于 2012-11-23T21:16:19.463 回答