Python 保存字典中没有值的键

Python 保存字典中没有值的键,python,dictionary,graph,Python,Dictionary,Graph,我将加权图表示为一个字典,其中键表示一个顶点,下面的列表表示顶点上的边,边的第一个数权重和相邻顶点的第二个数: 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

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

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]}
我想将字典中没有值的随机键保存到名为VISISTED的列表中

random_num = random.randrange(len(wGraph))

visited = []

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

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

random.choice(wGraph.keys())

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

random.choice(wGraph.keys())

答案取决于细节-您有多少个键,它们是否总是数字1…最大值,是否要重新访问您以前访问过的键,是随时间添加的图节点,还是它们保持不变,您最终会访问所有键还是只访问其中的一小部分,等等

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

另一个选项是仅将密钥列表随机化一次:

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

只要你需要新的,随时打电话给我。这仅在您不想重新访问节点且节点列表保持不变的情况下有效。

答案取决于详细信息-您有多少个键,它们总是数字1…最大值,您想重新访问您以前访问过的键,是随时间添加的图节点,还是它们保持不变,您最终会访问所有密钥还是只访问其中的一小部分,等等

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

另一个选项是仅将密钥列表随机化一次:

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

只要你需要新的,随时打电话给我。仅当您不想重新访问节点且节点列表为常量时,此操作才有效。

不幸的是,此操作效率太低。除非您想直接处理C结构,否则Python无法在不具体化键列表的情况下选择一个随机键。@user2357112 Python是oss,所以请随意提交补丁。@Brunodesshuilliers:不过,设计符合Python设计理念的功能并不是一个好方法。如果您只提供了一个get random key函数,那么它将错过许多类似的用例,例如绘制随机样本,特别是对于拒绝采样效率低下的大样本。如果您提供对哈希表的更直接的访问,那么您将很难公开实现细节,而且它是一个很难使用的接口。任何提供有效随机密钥选择的尝试都会限制其他Python…实现的设计决策,因为您需要开放寻址或PyPy的密集密钥数组之类的东西来支持它;单独的链接将使其变得困难。如果您确实需要频繁、高效的随机键选择,最好自己维护一个键列表。性能机会就在那里,这让我有点不舒服,但似乎没有一个好的方法来利用它。当我尝试在python 3中使用它时,它给了我:TypeError:“dict_keys”对象不支持索引。不幸的是,这太低效了。除非您想直接处理C结构,否则Python无法在不具体化键列表的情况下选择一个随机键。@user2357112 Python是oss,所以请随意提交补丁。@Brunodesshuilliers:不过,设计符合Python设计理念的功能并不是一个好方法。如果您只提供了一个get random key函数,那么它将错过许多类似的用例,例如绘制随机样本,特别是对于拒绝采样效率低下的大样本。如果您提供对哈希表的更直接的访问,那么您将很难公开实现细节,而且它是一个很难使用的接口。任何提供有效随机密钥选择的尝试都会限制其他Python…实现的设计决策,因为您需要开放寻址或PyPy的密集密钥数组之类的东西来支持它;单独的链接将使其变得困难。如果您确实需要频繁、高效的随机键选择,最好自己维护一个键列表。性能机会就在那里,这让我有点不舒服,但似乎没有一个好的方法来利用它。当我尝试在python 3中使用它时,它给了我:TypeError:“dict_keys”对象不支持索引键总是只有数字1…max吗?然后答案就是randon_num+1。是的,我也在想,但我更喜欢一个可以找到钥匙的时尚风格
d即使键不是数字顺序,或者当键是例如字母时。键总是只有数字1…max吗?然后答案就是randon_num+1。是的,我也在考虑这个问题,但我更喜欢一种时髦的方式,在这种方式下可以找到键,即使键不是数字顺序,或者当键是例如字母时。当我尝试使用shuffle时,它会给我:TypeError:“dict_keys”对象不支持indexing@Leero11:哎呀,我太习惯Python 2了。在Python3中,您需要将keys迭代器转换为list first keys_to_Visite=listwGraph.keys。当我尝试使用shuffle时,它给出了:TypeError:“dict_keys”对象不支持indexing@Leero11:哎呀,我太习惯Python 2了。在Python3中,需要将keys迭代器转换为列表first keys_to_visit=listwGraph.keys。