如何解决将 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 举报,一经查实,本站将立刻删除。