我有以下字典和鍵串列。我想做的是,如果這些鍵在字典中并且它們的值中有任何數字(它們是字串)。我想將這些數字更改為'#'字符。
字典:
{"name":"Jone","age":"40 years","phone":"88777444"}
鍵:
["age","phone"]
輸出:
{"name":"Jone","age":"## years","phone":"########"}
到目前為止,我已經能夠獲取這些數字,但不知道如何在字典中更改它們:
我的進步:
def convert(input, keys):
for k in range(len(keys)):
if keys[k] in input:
for el in input[keys[k]]:
if el.isdigit():
print(el)
如您所見,我正在使用python。如果您使用不同的語言,對正確方向的提示會很棒。
uj5u.com熱心網友回復:
這與已經給出的答案基本相同,但采用了一種更容易適應擁有字典串列的方法:
import re
d = {"name":"Jone","age":"40 years","phone":"88777444"}
keys = ["age","phone"]
for k, v in d.items():
if k in keys:
d[k] = re.sub('\d', '#', v)
print(d)
輸出:
{'name': 'Jone', 'age': '## years', 'phone': '########'}
uj5u.com熱心網友回復:
我會推薦一個正則運算式。
import re
data = {"name":"Jone","age":"40 years","phone":"88777444"}
keys = ["age","phone"]
for key in keys:
if key in data:
# replace every key with a new string where every number
# ('[0-9]') is substituted by a '#'
data[key] = re.sub('[0-9]', '#', data[key])
# {'name': 'Jone', 'age': '## years', 'phone': '########'}
print(data)
uj5u.com熱心網友回復:
這是使用字典理解的單行解決方案。
d = {k: re.sub("\d", "#", d[k]) if k in keys else v for k, v in d.items()}
uj5u.com熱心網友回復:
沒有的解決方案re:
d = {"name": "Jone", "age": "40 years", "phone": "88777444"}
keys = ["age", "phone"]
for k in d.keys() & keys:
d[k] = "".join("#" if c in "0123456789" else c for c in d[k])
print(d)
印刷:
{'name': 'Jone', 'age': '## years', 'phone': '########'}
uj5u.com熱心網友回復:
我看到了 2 種方法,基于reand if ... else ...,我在這里添加了一種基于str.translate.
re通過預編譯正則運算式可以稍微優化這些方法,但該str.maketrans方法仍然更快一些(參見底部的性能)。
import re
from string import digits
digits_re = re.compile(r"\d")
trans_dict = dict.fromkeys(digits, "#")
trans_table = str.maketrans(trans_dict)
def obfuscate_dict_tr(d):
return {k: v.translate(trans_table) for k, v in d.items()}
def obfuscate_dict_re(d):
return {k: digits_re.sub("#", v) for k, v in d.items()}
def obfuscate_dict_cond(d):
return {k: "".join("#" if c in digits else c for c in v) for k, v in d.items()}
要嘗試大型字典,我將使用該faker庫:
In [ ]: from faker import Faker
...:
...: fake = Faker()
...: num_keys = 10_000
...: d = {fake.name(): fake.address() for _ in range(num_keys)}
讓我們首先檢查所有方法是否等效:
In [ ]: d1 = obfuscate_dict_tr(d)
...: d2 = obfuscate_dict_re(d)
...: d3 = obfuscate_dict_cond(d)
...:
...: assert d1 == d2
...: assert d2 == d3
然后是性能比較
In [ ]: %timeit obfuscate_dict_tr(d)
...: %timeit obfuscate_dict_re(d)
...: %timeit obfuscate_dict_cond(d)
14.1 ms ± 216 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
16 ms ± 255 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
28.7 ms ± 217 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)
uj5u.com熱心網友回復:
import re
input_={"name":"Jone",
"age":"40 years",
"phone":"88777444"}
key=["age","phone"]
def convert(input_, keys):
for k in range(len(keys)):
if keys[k] in input:
input_[keys[k]] = re.sub(r'\d', "#", input_[keys[k]])
return input_
print(convert(input_,key))
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/496870.html
上一篇:我如何在kivypython中的不同布局類之間進行通信
下一篇:我想按字典中元組的第一個元素排序
