用相应的值替换字典中的所有布尔值而不循环遍历字典
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)
我有以下字典:
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)