Python:执行此循环的pythonic方法是什么?

时间:2009-09-11 16:21:12

标签: python

执行此循环的pythonic方法是什么。我正在尝试选择一个随机密钥,它将返回一个子树而不是根。因此:'parent == None'不可能是真的。

thekey = random.choice(tree.thedict.keys())
while (tree.thedict[thekey].parent == None)or(tree.thedict[thekey].isRoot == True):
        thekey = random.choice(tree.thedict.keys())
.......

编辑:现在可以使用

8 个答案:

答案 0 :(得分:3)

  

得到一个不是的随机子树   根

not_root_nodes = [key, node for key,node in tree.thedict.iteritems() if not ( node.parent is None or node.isRoot)]
item = random.choice( not_root_nodes )

答案 1 :(得分:3)

key = random.choice([key for key, subtree in tree.thedict.items()
                         if subtree.parent and not subtree.isRoot])

(在评论和问题版本后更正)

答案 2 :(得分:1)

thekey = random.choice(tree.thedict.keys())
parent = thedict[thekey].parent
while parent is None or parent.isRoot:
    thekey = random.choice(tree.thedict.keys())
    parent = thedict[thekey].parent

答案 3 :(得分:1)

我认为这有点好看:

theDict = tree.thedict

def getKey():
    return random.choice(theDict.keys())

theKey = getKey()

while theDict[thekey].parent in (None, True):
    thekey = getKey()

您怎么看?

答案 4 :(得分:0)

def is_root(v): 
  assert (v.parent != None) == (v.isRoot)
  return v.isRoot
  #note how dumb this function looks when you guarantee that assertion

def get_random_nonroot_key():
  while True:
    thekey = random.choice(tree.thedict.keys())
    value = tree.thedict[thekey]
    if not is_root(value): return key

或Roberto Bonvallet的答案的重构

def get_random_nonroot_key():
  eligible_keys = [k for k, v in tree.thedict.items() if not is_root(v)]
  return random.choice(eligible_keys)

答案 5 :(得分:0)

我认为你的状况有缺陷:

我认为你期望这样: tree.thedict[thekey].parent == None
应该等于: tree.thedict[thekey].parent.isRoot == True

事实上,两者都意味着“此节点不是根”,您应该将第二个语句更改为: tree.thedict[thekey].isRoot == True

如上所述,您的条件测试说“当此节点是根节点或此节点的父节点是根”时。如果您的树结构是具有许多叶节点的单个根节点,则在这种情况下应该期望无限循环。

这是重写:

thekey = random.choice(k for k in tree.thedict.keys() if not k.isRoot)

答案 6 :(得分:0)

thekey = random.choice(tree.thedict.keys())
parent = tree.thedict[thekey].parent
while parent is None or tree.thedict[thekey].isRoot:
    thekey = random.choice(tree.thedict.keys())
    parent = thedict[thekey].parent

答案 7 :(得分:0)

就个人而言,我不喜欢在while循环之前重复初始化key,然后再在循环内重复。这可能是错误的根源;如果某人编辑了两个初始化中的一个并忘记编辑另一个,会发生什么?即使这种情况从未发生过,任何阅读代码的人都需要仔细检查以确保两个初始化完全匹配。

我会这样写:

while True:
    thekey = random.choice(tree.thedict.keys())
    subtree = tree.thedict[thekey]
    if subtree.parent is not None and not subtree.isRoot:
        break

P.S。如果你真的只想要子树,而不关心查找子树所需的密钥,你甚至可以这样做:

while True:
    subtree = random.choice(tree.thedict.values())
    if subtree.parent is not None and not subtree.isRoot:
        break

有些人可能不喜欢使用“while True:”但这是标准的Python习惯用法“永远循环直到某些内容运行break”。恕我直言,这是简单,清晰,惯用的Python。

P.P.S。这段代码应该包含在if语句中,该语句检查树有多个节点。如果树只有一个根节点,那么这段代码将永远循环。