Python 如何将字典的字符串值转换为布尔值?
我创建了一个包含键和值的字典。读取如下文本文件后: 测试1 豪斯:没错 汽车:假的 钱:假的 案例:1 测试2 豪斯:没错 汽车:假的 钱:假的 案例:2 测试3 豪斯:没错 汽车:假的 钱:假的 案例:3 词典被创建。问题是这些值被读取为字符串。我需要将它们作为bool,以便以后可以将它们解析为JSON文件,并将它们作为bool使用。创建的字典称为答案。我尝试了以下方法,但它只给出布尔值形式的True: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
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”