Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将字典的字符串值转换为布尔值?_Python_Dictionary_Boolean_Key Value Store - Fatal编程技术网

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

Python 如何将字典的字符串值转换为布尔值?,python,dictionary,boolean,key-value-store,Python,Dictionary,Boolean,Key Value Store,我创建了一个包含键和值的字典。读取如下文本文件后: 测试1 豪斯:没错 汽车:假的 钱:假的 案例:1 测试2 豪斯:没错 汽车:假的 钱:假的 案例:2 测试3 豪斯:没错 汽车:假的 钱:假的 案例:3 词典被创建。问题是这些值被读取为字符串。我需要将它们作为bool,以便以后可以将它们解析为JSON文件,并将它们作为bool使用。创建的字典称为答案。我尝试了以下方法,但它只给出布尔值形式的True: to_json = {} block_cnt = 1 header

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

测试1 豪斯:没错 汽车:假的 钱:假的 案例:1 测试2 豪斯:没错 汽车:假的 钱:假的 案例:2 测试3 豪斯:没错 汽车:假的 钱:假的 案例:3 词典被创建。问题是这些值被读取为字符串。我需要将它们作为bool,以便以后可以将它们解析为JSON文件,并将它们作为bool使用。创建的字典称为答案。我尝试了以下方法,但它只给出布尔值形式的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()
然后在转换后,我只得到类似的东西,但所有东西都在一行中:

{1 { 豪斯:没错 汽车:是的 钱:真的 案例:[1] } } {2 { 豪斯:没错 汽车:是的 钱:真的 案例:[2]} {3 { 豪斯:没错 汽车:是的 钱:真的 案例:[3]} 所以字符串都被转换成真正的布尔值,事实并非如此。 另一个问题是,这些值是在列表中读取的。有没有办法避免这种情况?谢谢。

mapbool,answer[key]正在将函数映射到字符串的字符上。所有非空字符都为true,因此您应该只期望得到true

您需要实际检查==True

换句话说,boolFalse的结果可能会让您感到惊讶

mapbool,answer[key]将函数映射到字符串的字符上。所有非空字符都为true,因此您应该只期望得到true

您需要实际检查==True

换句话说,boolFalse的结果可能会让您大吃一惊。

映射用于将函数应用于iterable中的每个值

您可以改为使用:

此外,不需要在单独的if语句中检查每个键。如果您在逻辑中同时使用key和value,那么迭代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()}
映射用于将函数应用于iterable中的每个值

您可以改为使用:

此外,不需要在单独的if语句中检查每个键。如果您在逻辑中同时使用key和value,那么迭代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()}
为什么不简单地:

for key in answer.keys():
   answer[key] = answer[key] == "True"
为什么不简单地:

for key in answer.keys():
   answer[key] = answer[key] == "True"

如果我知道你的布尔是字符串,你需要它们实际上是布尔,如果是这样,字典理解就行了

d = {k: True if d[k] == 'True' else False for k in d}

如果我知道你的布尔是字符串,你需要它们实际上是布尔,如果是这样,字典理解就行了

d = {k: True if d[k] == 'True' else False for k in d}


请显示解析文件的代码密钥是否有尾随空格,例如“House”而不是“House”?映射将对值中的每个字符应用bool,例如“False”将给出[True,True,True,True,True]作为bool'F'==True,bool'a'==True,bool'l'==True,等等。显示解析文件的代码+1,这样我们就可以准确地看到你的答案了。@PeterWood我写了完整的代码,输入和输出。希望有帮助:请显示解析文件的代码密钥是否有尾随空格,例如“House”而不是“House”?map将对值中的每个字符应用bool,例如“False”将[True,True,True,True,True]作为bool'F'==True,bool'a'==True,bool'l'==True,等等。显示解析文件的代码+1,这样我们就可以准确地看到你的答案了。@PeterWood我写了完整的代码,输入和输出。希望这有帮助:我不认为这是原因,否则OP会得到一个bool列表。我认为它根本没有应用转换,因为键中有空格。map应该返回一个列表或生成器是的,但这不是OP看到的,所以我使用了问题中给出的最小信息。不过,使用map是不正确的。我不认为这是原因,否则OP会得到一个bool列表。我认为它根本没有应用转换,因为键中有空格。map应该返回一个列表或生成器是的,但这不是OP看到的,所以我使用了问题中给出的最小信息。不过,使用地图是不正确的。或者只是为了输入答案:嗨,现在它打印所有错误或者只是为了输入答案:嗨,现在它打印所有错误嗨,谢谢你的回答。我仍然收到以下错误:回溯最近的调用last:File.\s-Kopie.py,第49行,在answer[key]=literal\u evalvalue文件C:\Python27\lib\ast.py,第80行,在literal\u eval return\u convertnode\u或字符串文件C:\Python27\lib\ast.py,第79行,in_convert raise VALUERROR'malformed string'ValueError:格式错误的stringI无法复制。看起来您的某个字符串不是真的或假的。这没有反映在原始问题中。值在列表中。例如:House:['True']Car:['False']等。这可能是原因吗?@Dj_96,是的,这是可能的
原因是什么。如果这些是列表,您需要在我的解决方案中使用值[0]或v[0]来获取第一项。我尝试了它,上面的错误消失了。但是我得到了另一个错误:answer[key]=literal_evalvalue[0]TypeError:“bool”对象没有属性“getitem”嗨,谢谢你的回答。我仍然收到以下错误:回溯最近的调用last:File.\s-Kopie.py,第49行,在answer[key]=literal\u evalvalue文件C:\Python27\lib\ast.py,第80行,在literal\u eval return\u convertnode\u或字符串文件C:\Python27\lib\ast.py,第79行,in_convert raise VALUERROR'malformed string'ValueError:格式错误的stringI无法复制。看起来您的某个字符串不是真的或假的。这没有反映在原始问题中。值在列表中。例如:豪斯:['True']汽车:['False']等等。这可能是原因吗?@Dj_96,是的,这可能就是原因。如果这些是列表,您需要在我的解决方案中使用值[0]或v[0]来获取第一项。我尝试了它,上面的错误消失了。然而,我得到了另一个错误:answer[key]=literal_evalvalue[0]TypeError:“bool”对象没有属性“getitem”