将随机值设置为字典的一半,并复制其余部分



我有一个由其他列表通过创建的python字典

a = dict.fromkeys(some_list)

因为我通过上面的命令创建了这个字典,所以字典中的所有值都是预期的None。看起来是这样的:

a = {('A', 'B'): None,
('A', 'C'): None,
('B', 'A'): None,
('C', 'A'): None}

我想要的是:能够通过random.uniform(0,1)None值更改为随机数。

然而,我不想对整个字典这样做,而是只复制前两个关键字(('A', 'B')('A', 'C')(,其余的(('B', 'A')('C', 'A')(应该从前两个密钥复制。

以下将所有值设置为随机数。然而,我找不到一种方法将前两个设置为随机的,其余的都是在不硬编码密钥的情况下复制的。

for key in a:
a[key] = random.uniform(0, 1)

有什么建议吗?

visited = set()
for key in a:
if key in visited:
continue

# mark key as visited
visited.add(key)
visited.add(key[::-1])
value = np.random.uniform(0, 1)
a[key] = value
a[key[::-1]] = value

更动态、更有效的解决方案是散列给定的密钥,从而忽略元组顺序

def hash_tuple(t):
hash_value = 0
for elem in t:

if isinstance(elem, int):

hash_value += elem

elif isinstance(elem, str):
hash_value += ord(elem)

else:
raise ValueError(f'Invalid Type {type(elem)}')

return hash_value

global_seed = np.random.randint(0, 100)
for key in a:
seed = hash_tuple(key) + global_seed
random = np.random.RandomState(seed)
value = random.uniform(0, 1)
a[key] = value

假设dict中的密钥没有按任何特定顺序插入:

for key in a:
n = random.uniform(0, 1)
a[key] = n
if (key[1], key[0]) in a:
a[key[1], key[0]] = n

我的方法不仅允许键元组中有两个元素,可以是任何数字,顺序也无关紧要。

import random
a = {('A', 'B'): None,
('A', 'C'): None,
('B', 'A'): None,
('C', 'A'): None}
tuple_group_dict = {t: ''.join(sorted(t)) for t in a.keys()}
# print(tuple_group_dict)
group_rand_dict = {g: random.uniform(0, 1) for g in tuple_group_dict.values()}
# print(group_rand_dict)
for k in a:
a[k] = group_rand_dict[tuple_group_dict[k]]
print(a)
# {('A', 'B'): 0.19127468345979626, ('A', 'C'): 0.5162477118368421, ('B', 'A'): 0.19127468345979626, ('C', 'A'): 0.5162477118368421}

最新更新