微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 dict 中的所有布尔值替换为相应的值而不循环遍历 dict

如何解决将 dict 中的所有布尔值替换为相应的值而不循环遍历 dict

我有以下字典:

d = {
    "one": False,"two": True,"three": False,"four": True,"five": False
    }

我想用True替换每个"Hello"实例,用False替换Good night的每个实例。

最后,我想要以下字典:

d = {
    "one": "Good night","two": "Hello","three": "Good night","four": "Hello","five": "Good night"
    }

有没有办法不用 for 循环,或者不用迭代每个值?

编辑:我仍然可以使用 for,我只是想知道是否有比 for 块更短的方法。另外我想知道是否有一种速记可以将布尔值“映射”到字典中的值。

如果不浏览/循环遍历字典的每个键/值,我就无法做到。根据其他答案,我尝试了这个:d = d.update( (k,"Hello") for k in d ) 但这用于替换所有值,而不是在条件下。

解决方法

您可以在恒定时间内创建具有相同效果的不同数据结构:

def lazy_converted(dct):
    class D(dict):
        def __getitem__(self,k):
            if k in dct:
                if dct[k] is True:
                    return "Hello"
                if dct[k] is False:
                    return "Good night"
                return dct[k]
            return super().__getitem__(k)
    return D()

>>> d = lazy_converted(d)
>>> d["one"]
'Good night'
>>> d["two"]
'Hello'

请注意,d 仍然是 dict,转换不涉及任何迭代并且在恒定时间内发生,您仍然可以设置新键:

>>> d["acd"] = 5
>>> d["acd"]
5
,

不,没有循环就没有办法做到这一点。

for key,val in d.items():
    d[key] = "Hello" if val else "Good night"
,

由于需要检查每个key,所以不会比O(n)快

>>> d = {
...     "one": False,...     "two": True,...     "three": False,...     "four": True,...     "five": False
...     }
>>> 
>>> replacement = {False:'Good night',True:'Hello'}
>>> d = {k:replacement.get(v) for k,v in d.items()}
>>> d
{'one': 'Good night','two': 'Hello','three': 'Good night','four': 'Hello','five': 'Good night'}
>>> 

,

您可以使用以下生成器来实现:

d = {
    "one": False,"two": True,"three": False,"four": True,"five": False
    }
d.update((k,"Hello" if d[k] else "Good night") for k in d.keys())
print(d)
# {'one': 'Good night','five': 'Good night'}

不过,正如评论中提到的,这并不比常规的 for 循环快。

,

我的意思是你可以,但不知道为什么你会:

>>> choices = ('Good Night','Hello')
>>> *_,= map(lambda x,y: dict.update(d,{x:choices[y]}),d.keys(),d.values())
>>> d
{'one': 'Good Night','three': 'Good Night','five': 'Good Night'}

相当甜蜜的字典理解:

>>> choices = ('Hello','Good Night')
>>> d = {k: choices[v] for k,v in d.items()}
>>> d
{'one': 'Good Night','five': 'Good Night'}
,

我认为不使用任何循环的唯一方法是以下方法。 在这个方法中,我们使用了 json 库,因此我们可以将字典转换为字符串,然后替换值,最后再次将其转换为字典。

import json

d = {
    "one": False,"five": False
    }  
       
# Serializing json    
d = json.dumps(d)   

# Replace true by "Hello"
d = d.replace('true','"Hello"')
    
# Replace false by "Good night"
d = d.replace('false','"Good night"')

# Convert string to dictionary
d = json.loads(d)

print(d)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?