Skip to main content
 首页 » 编程设计

python之如何将字典的字符串值转换为 boolean 值

2025年05月04日23TianFang

我创建了一个包含键和值的字典。阅读这样的文本文件后:

test1 
    House: True 
    Car: False 
    Money: False 
    Case: 1 
 
test2 
    House: True 
    Car: False 
    Money: False 
    Case: 2 
 
test3 
    House: True 
    Car: False 
    Money: False 
    Case: 3 

字典已创建。问题是这些值被读取为字符串。我需要将它们作为 boolean 值,以便稍后我可以将它们解析为 JSON 文件并在那里将它们作为 boolean 值使用。创建的字典称为 answer。我尝试了以下但它只给我 True 作为 boolean 值:

    to_json = {} 
    block_cnt = 1 
    header = re.compile('[a-zA-Z0-9]') 
    inner = re.compile("[\t]") 
    empty = re.compile("[\n]",)` 
 
    with open(rDEMO_parameters.txt', 'r') as document: 
    for line in document: 
        #print line 
        if empty.match(line[0]): 
            continue 
 
        elif header.match(line[0]): 
            if answer: 
                to_json[block_cnt] = answer 
                #print answer 
                block_cnt += 1 
                answer = {} 
        elif inner.match(line[0]): 
            _key, value = line.split(":  ") 
            tab, key = _key.split("\t") 
            answer[key] = value.split() 
           for key in answer.keys(): 
            if key == "House": 
                answer[key] = map(bool, answer[key]) 
            if key == "Car": 
                answer[key] = map(bool, answer[key]) 
            if key == "Money": 
                answer[key] = map(bool, answer[key]) 
            if key == "Case": 
                answer[key] = map(int, answer[key]) 
 
 
   f = open(r"parameters.json", "w") 
 
   json.dump(to_json, f) 
   f.close() 

然后在转换后我只得到这样的东西,但所有内容都在一行中:

 {1 
   { 
    House: True 
    Car: True 
    Money: True 
    Case: [1] 
             } } 
 {2 
   { 
    House: True 
    Car: True 
    Money: True 
    Case: [2] } } 
 {3 
    { 
    House: True 
    Car: True 
    Money: True 
    Case: [3] }} 

所以字符串都转成了True boolean 值,其实不然。 另一个问题是值是在列表中读取的。有什么方法可以避免这种情况吗?谢谢。

请您参考如下方法:

map 用于将函数应用于可迭代对象中的每个值。

您可以使用 ast.literal_eval相反:

from ast import literal_eval 
 
answer[key] = literal_eval(answer[key]) 

此外,您不需要在单独的 if 语句中检查每个键。如果您在逻辑中同时使用键和值,则迭代 dict.items 也更符合习惯:

for key, value in answer.items(): 
    if key in ('House', 'Car', 'Money'): 
        answer[key] = literal_eval(value) 

最后,考虑改用字典推导式:

# for modifying over all values 
answer = {k: literal_eval(v) for k, v in answer.items()} 
 
# for modifying selected values 
select = {'House', 'Car', 'Money'} 
answer = {k: literal_eval(v) if k in select else v for k, v in answer.items()}