执行此循环的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())
.......
答案 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语句中,该语句检查树有多个节点。如果树只有一个根节点,那么这段代码将永远循环。