【问题标题】:Setting random values to half of the dictionary and copying the rest将随机值设置为字典的一半并复制其余部分
【发布时间】:2021-06-24 14:10:11
【问题描述】:

我有一个由其他列表通过以下方式创建的 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 值更改为随机数。

但是我不想对整个字典这样做,而是只复制前 2 个键(('A', 'B')('A', 'C')),其余的(('B', 'A')('C', 'A'))应该从第一个复制2 键。

以下将所有值设置为随机数。但是,我找不到将前两个设置为随机的方法,其余的则在不对密钥进行硬编码的情况下复制。

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

有什么建议吗?

【问题讨论】:

  • 我的意思是AB.value == BA.value

标签: python dictionary random key


【解决方案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

【讨论】:

  • 我认为这也可以,但我真的在寻找最简单的选项。不过还是谢谢你!!
  • 我认为这比公认的答案更好。有了接受的答案,我认为你会更新与 ('A', 'B') 键关联的值两次:迭代器到达 ('A', 'B') 时一次,迭代器到达 (' B','A')。
  • 你是对的@AlexWaygood,但是如果键有 3 个元素,例如 ('A', 'B', 1) 而另一个键是 ('B', 'A ',1)。有什么建议可以代替key[::-1]
  • 我发现它把 3 个元素元组的 key[::-1] 更改为 key[:2:][::-1] + (key[2],)
【解决方案2】:

假设您的 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

【讨论】:

  • 我认为这行得通。基本上,我唯一想要实现的就是将随机数放入我的密钥中,并用该随机数均衡复制/转置的版本。
  • 那么是的,这正是实现了这一点:)
【解决方案3】:

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

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}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多