【问题标题】:Saving a key from a dictionary without value从字典中保存一个没有值的键
【发布时间】:2016-06-23 06:24:09
【问题描述】:

我将加权图表示为字典,其中键表示顶点,以下列表表示入射在顶点上的边(边的第一个数字权重和相邻顶点的第二个数字):

wGraph = { 1 : [[2, 2],[3, 4],[3, 3]],
       3 : [[3, 2],[5, 4],[7, 5]],
       2 : [[2, 1],[4, 4],[3, 6]],
       4 : [[3, 1],[4, 2],[1, 6],[5, 3]],
       6 : [[3, 2],[1, 4],[8, 5]],
       5 : [[7, 3],[8, 6],[9, 7]],
       7 : [9, 5]}

我想将一个没有值的随机键从字典中保存到一个名为visited的列表中。

random_num = random.randrange(len(wGraph))

visited = []

如何根据随机数从字典中获取key?

【问题讨论】:

  • 键总是只有数字 1...max 吗?那么答案就是randon_num + 1
  • 是的,我也在考虑这个问题,但我更喜欢一个可以创建密钥的方式,即使密钥不是数字顺序,或者密钥是例如字母。

标签: python dictionary graph


【解决方案1】:

要从某些值中随机选择,请使用random.choice。您想从字典的键中进行选择,所以这正是您传入的内容:

random.choice(wGraph.keys())

【讨论】:

  • 很遗憾,效率如此之低。除非您想直接弄乱 C 结构,否则 Python 无法在不实现键列表的情况下选择随机键。
  • @user2357112 python 是 oss,所以请随时提交补丁。
  • @brunodesthuilliers:不过,没有真正好的方法来设计符合 Python 设计理念的功能。如果只提供“获取随机密钥”功能,它会遗漏很多类似的用例,例如抽取随机样本(尤其是拒绝采样效率低下的大样本)。如果您提供对哈希表的更直接访问,那么您将很难公开实现细节,并且使用它是一个尴尬的接口。任何提供有效随机密钥选择的尝试也限制了其他 Python 可用的设计决策......
  • 实现,因为你需要像开放寻址或 PyPy 的密集键数组这样的东西来支持它;单独的链接会使其变得困难。如果您确实需要频繁、高效的随机密钥选择,最好自己维护一个密钥列表。表演机会就在那里,这让我有点烦恼,但似乎没有一个好的方法来抓住它。
  • 当我尝试在 python 3 中使用它时,它给了我:TypeError: 'dict_keys' object does not support indexing
【解决方案2】:

答案取决于细节——你有多少个键,它们是否总是数字 1...max,你想重新访问你以前访问过的键,是随着时间的推移添加图形节点还是它们保持不变,您最终会访问所有密钥还是只访问其中的一小部分,等等。

一个想法:如果您的密钥始终按您的示例中的顺序编号,您可以使用random_num + 1。你已经知道它们是 dict 的键,你不必构造任何特殊的东西。

另一种选择是将密钥列表随机化一次:

>>> keys_to_visit = wGraph.keys()
>>> keys_to_visit.shuffle()
>>> first_key_to_visit = keys_to_visit.pop()

只要你需要一个新的,就继续调用 .pop() 。这仅在您不想重新访问节点并且节点列表不变时才有效。

【讨论】:

  • 当我尝试使用随机播放时,它给了我:TypeError: 'dict_keys' object does not support indexing
  • @Leero11:哎呀,我对 Python 2 太习惯了。在 Python 3 中,您需要先将键迭代器转换为列表 (keys_to_visit = list(wGraph.keys()))。
【解决方案3】:
import random

visited = []

def random_key():
    wGraph = {1: [[2, 2], [3, 4], [3, 3]],
              3: [[3, 2], [5, 4], [7, 5]],
              2: [[2, 1], [4, 4], [3, 6]],
              4: [[3, 1], [4, 2], [1, 6], [5, 3]],
              6: [[3, 2], [1, 4], [8, 5]],
              5: [[7, 3], [8, 6], [9, 7]],
              7: [9, 5]}

    random_key = random.choice(wGraph.keys())

    if random_key not in visited:
        visited.append(random_key)
    print visited


for e in range(7):
    random_key()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多