【问题标题】:How to convert the string value of a dictionary into boolean values?如何将字典的字符串值转换为布尔值?
【发布时间】:2019-03-07 16:50:48
【问题描述】:

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

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布尔值,事实并非如此。 另一个问题是值是在列表中读取的。有什么方法可以避免吗?谢谢。

【问题讨论】:

  • 请出示解析文件的代码
  • 键是否有尾随空格,例如'House ' 而不是'House'
  • mapbool 应用于值中的每个字符,例如'False' 将给 [True, True, True, True, True]bool('F') == Truebool('a') == Truebool('l') == True 等。
  • 显示解析文件 +1 的代码,以便我们准确查看您的答案字典。
  • @PeterWood 我输入了完整的代码、输入和输出。希望有帮助:)

标签: python dictionary boolean key-value-store


【解决方案1】:

如果我理解您的布尔值是字符串并且您需要它们实际上是布尔值,那么 字典理解 将起作用

d = {k: True if d[k] == 'True' else False for k in d}
 {'House': True, 'Car': False, 'Money': False}

【讨论】:

    【解决方案2】:

    为什么不简单:

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

    【讨论】:

    • 或者只是for key in answer:
    • 嗨,现在它打印的都是假的
    【解决方案3】:

    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()}
    

    【讨论】:

    • 您好,谢谢您的回答。我仍然收到以下错误: Traceback(最近一次调用最后一次):文件“.\s - Kopie.py”,第 49 行,在 answer[key] = literal_eval(value) File "C:\Python27\ lib\ast.py”,第 80 行,在 literal_eval 中返回 _convert(node_or_string) 文件“C:\Python27\lib\ast.py”,第 79 行,在 _convert 中引发 ValueError('malformed string') ValueError: malformed string跨度>
    • 我无法复制。看起来您的字符串之一是not "True""False"。这未反映在您的原始问题中。
    • 值在列表中。例如:House: ['True'] Car: ['False'] etc. 难道是这个原因?
    • @Dj_96,是的,这可能就是原因。如果这些是列表,您需要在我的解决方案中使用 value[0]v[0] 来获取第一项。
    • 我试过了,上面的错误消失了。但是我得到另一个错误: answer[key] = literal_eval(value[0]) TypeError: 'bool' object has no attribute 'getitem'
    【解决方案4】:

    map(bool, answer[key]) 将函数映射到字符串的字符上。所有非空字符都是真,所以你应该期望只得到真。

    您需要实际检查== "True"

    换句话说,bool("False") 的结果可能会让你大吃一惊

    【讨论】:

    • 我不认为这是原因,否则 OP 会得到 boollist。我认为它根本没有应用转换,因为键中有空格。
    • map() 应该返回一个列表或生成器,是的,但这不是 OP 所看到的,所以我使用了问题中给出的最少信息。尽管如此,使用地图是不正确的。
    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 2012-04-02
    • 2021-02-23
    • 2018-09-07
    • 1970-01-01
    • 2013-01-24
    • 2016-07-13
    相关资源
    最近更新 更多