微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果值出现在元组列表中,则条件为真

如何解决如果值出现在元组列表中,则条件为真

我是 Python 新手,在实现绘制图形的算法时遇到了问题。我有一个包含某些节点及其“级别”(用于分层)的元组列表。最初看起来像这样:

[(0,10),(1,'empty'),(2,(3,(4,(5,(6,(7,(8,(9,'empty')](节点,级别)

现在我需要为这些节点分配级别,只要任何节点都没有级别,相应的 'empty' 属性

我尝试了几种可能的 while 条件结构,它们在语法上没有错,但在语义上没有任何意义,因为 while 循环没有终止:

while (True for node,level in g.nodes(data='level') if level == 'empty'):

while ( 'empty' in enumerate(g.nodes(data='level') ):

和某些其他类似的构造,它们不起作用,我不记得了..

直到现在我似乎还不清楚为什么这不起作用 - python 甚至没有在这些条件下进入 while 循环。你能解释一下原因并告诉我如何解决这个问题吗?

提示 g.nodes(data='level') 是一个 networkx 函数,它返回元组的上层列表

解决方法

所以括号中的内容是生成器表达式,它们总是计算为 True

您的想法是正确的,但可能需要更多地了解这些表达式以及如何使用它们。在您的第一个建议中,我_认为_您的意思是:

while any(level == 'empty' for node,level in g.nodes(data='level')):
  ...

在您的版本中,您要做的是创建一个生成器表达式,该表达式将包含多个 True 值,每个 empty 级别对应一个值。但是,即使该生成器表达式中没有元素,它本身也不是空对象,因此它的计算结果为 True

你可以试试这个:

bool([]) # --> False because empty sequence
bool(list(range(1,-10))) # --> False because empty sequence
bool((i for i in range(1,-10))) # --> True because non-None generator expression

所以你需要把你的生成器表达式变成一个真值,它实际上反映了它是否有任何真正的元素,这就是 any 函数所做的:取一个迭代器(或一个生成器表达式)并返回如果它的任何元素为真,则为真。

,

您正在尝试进行元素检查以搜索您。相反,专注于准确提取您需要检查的值。让我们从元组列表开始

g = [(0,10),(1,'empty'),(2,(3,(4,(5,(6,(7,(8,(9,'empty')]

现在获取仅包含级别的列表:

level = [node[1] for node in g]

现在,您的支票很简单

while "empty" in level:
    # Assign levels as appropriate
    # Repeat the check for "empty"
    level = [node[1] for node in g]

如果您一直在更新主图 g,则将级别提取折叠到 while 中:

while "empty" in [node[1] for node in g]:
    # Assign levels

最初,您的 while 失败,因为只要 True 中有任何内容,您就返回 g

while (True for node,level in ...)

您有一个很好的方法,但把它弄得过于复杂,并被 True 卡住了。

您的 enumerate 尝试失败,因为您在枚举数中搜索字符串,而不是在其返回值中搜索。您可以制作一个返回值的列表,但是我们又回到了开始的地方,带有一个元组列表。这会将“空”与每个元组进行比较,并且无法找到所需的字符串——它再往下一层。

,

其他答案可能是最好的。但是你要求的具体测试可以有几种写法:

这与您所拥有的类似,但创建的是一个列表而不是生成器。如果列表为空,则列表将评估为 False,但生成器不会。

while [True for node,level in g.nodes(data='level') if level == 'empty']:
   ...

这是一个同样有效的版本。该列表必须为空或不为空;元素是 True 还是 False 或其他东西并不重要:

while [node for node,level in g.nodes(data='level') if level == 'empty']:
   ...

或者你可以使用 Python 的 any 函数,它是为此而设计的,效率会更高一些(它在第一次匹配后停止检查元素)。这可以使用生成器或列表。

while any(level == 'empty' for node,level in g.nodes(data='level')):
   ...
,

如果您只是想为每个为空的级别分配级别,那么简单的 for 循环就足够了:

data = [(0,'empty')]
output = []

for node,level in data:
    if level == 'empty':
        level = ? #question mark is whatever level logic you wish to insert
    output.append((node,level))
,

仅仅使用 for 循环通常更像 Pythonic:

nodes = [(0,'empty')]

for node in nodes:
    if node[1]=="empty":
        node[1] = set_level_func() # customise this function as you wish
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。