如何将字典的字符串值转换为布尔值?
How to convert the string value of a dictionary into boolean values?
我创建了一个包含键和值的字典。阅读这样的文本文件后:
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
词典已创建。问题是这些值被读取为字符串。我需要将它们作为布尔值,以便稍后我可以将它们解析为 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()
然后在转换后我只得到这样的东西,但所有内容都在一行中:
{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
布尔值,其实不然。
另一个问题是值是在列表中读取的。有什么方法可以避免这种情况吗?谢谢。
map(bool, answer[key])
将函数映射到字符串的字符上。所有非空字符都为 true,因此您应该期望只得到 True。
您需要实际检查 == "True"
换句话说,bool("False")
的结果可能会让你大吃一惊
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()}
为什么不简单:
for key in answer.keys():
answer[key] = answer[key] == "True"
如果我理解您的布尔值是字符串并且您需要它们实际上是布尔值,那么词典理解 将起作用
d = {k: True if d[k] == 'True' else False for k in d}
{'House': True, 'Car': False, 'Money': False}
我创建了一个包含键和值的字典。阅读这样的文本文件后:
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
词典已创建。问题是这些值被读取为字符串。我需要将它们作为布尔值,以便稍后我可以将它们解析为 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()
然后在转换后我只得到这样的东西,但所有内容都在一行中:
{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
布尔值,其实不然。
另一个问题是值是在列表中读取的。有什么方法可以避免这种情况吗?谢谢。
map(bool, answer[key])
将函数映射到字符串的字符上。所有非空字符都为 true,因此您应该期望只得到 True。
您需要实际检查 == "True"
换句话说,bool("False")
的结果可能会让你大吃一惊
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()}
为什么不简单:
for key in answer.keys():
answer[key] = answer[key] == "True"
如果我理解您的布尔值是字符串并且您需要它们实际上是布尔值,那么词典理解 将起作用
d = {k: True if d[k] == 'True' else False for k in d}
{'House': True, 'Car': False, 'Money': False}