用相应的值替换字典中的所有布尔值而不循环遍历字典

Replace all boolean values in a dict by a corresponding value without looping through 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 块更短的方法。我还想知道是否有 shorthand 将布尔值“映射”到词典中的值。

如果没有 browsing/looping 遍历字典的每个 key/value,我无法做到这一点。根据其他答案,我试过这个:d = d.update( (k,"Hello") for k in d ) 但这是为了替换 所有 值,而不是在条件下。

不,没有循环是没办法的。

for key, val in d.items():
    d[key] = "Hello" if val else "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', 'two': 'Hello', 'three': 'Good night', 'four': 'Hello', 'five': 'Good night'}

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

因为需要检查每一个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'}
>>> 

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

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

相当甜美的听写理解:

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

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

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

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

import json

d = {
    "one": False,
    "two": True,
    "three": False,
    "four": True,
    "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)