如何将字典的字符串值转换为布尔值?

Dj_*_* 96 1 python dictionary boolean key-value-store

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

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
Run Code Online (Sandbox Code Playgroud)

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

    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()
Run Code Online (Sandbox Code Playgroud)

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

    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()
Run Code Online (Sandbox Code Playgroud)

所以字符串全部转换为True布尔值,事实并非如此。另一个问题是值是在列表内读取的。有什么方法可以避免这种情况吗?谢谢。

jpp*_*jpp 5

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

您可以使用ast.literal_eval

from ast import literal_eval

answer[key] = literal_eval(answer[key])
Run Code Online (Sandbox Code Playgroud)

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

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

最后,考虑使用字典理解来代替:

# 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()}
Run Code Online (Sandbox Code Playgroud)