1.按频率取字典中的key值
import random
def sample(data_dict):
"""
in: {"A":135,"B":200} / {24.0: 21984, 48.0: 2716}
out: A/B
"""
values = sum(data_dict.values())
prob = [round(i/values,4)for i in data_dict.values()]
keys = list(data_dict.keys())
x=random.uniform(0,1)
probability=0.0
for item,item_probability in zip(keys,prob):
probability+=item_probability
if x < probability: break
return item
smp = sample({24.0: 21984, 48.0: 2716})
print(smp) # 24.0
smp = sample({"A":135,"B":200})
print(smp) # B
smp = sample({'Homo sapiens': 20162, 'Mus musculus': 1915, 'Macaca fascicularis': 656})
print(smp) # Homo sapiens
2.使用装饰器统计函数的调用次数
import random
def call_counter(func):
def wrapper(*args, **kwargs):
wrapper.classes.append(args)
return func(*args, **kwargs)
wrapper.classes = []
return wrapper
@call_counter
def sample(data_dict):
"""
in: {"A":135,"B":200} / {24.0: 21984, 48.0: 2716}
out: A/B
"""
values = sum(data_dict.values())
prob = [round(i/values,4)for i in data_dict.values()]
keys = list(data_dict.keys())
x=random.uniform(0,1)
probability=0.0
for item,item_probability in zip(keys,prob):
probability+=item_probability
if x < probability: break
return item
smp = sample({24.0: 21984, 48.0: 2716})
print(smp) # 24.0
smp = sample({"A":135,"B":200})
print(smp) # B
smp = sample({'Homo sapiens': 20162, 'Mus musculus': 1915, 'Macaca fascicularis': 656})
print(smp) # Homo sapiens
print(f"函数调用了{len(sample.classes)}次")
3.合理的运用sum可以替换旧xml值到新xml
比如:需要将旧xml中的一行值替换成新的xml中的一行值。就像项目在不断更新,xml中新的一列值必定有新增的,新的需要又要要旧序列的值。因此可以利用变量的映射,将新旧序列的值映射到每个变量中,并用字典新旧保存变量的长度和值,就可以利用sum更新位置,从而替换新序列的值。