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

列表推导式可以使用多个变量吗?

如何解决列表推导式可以使用多个变量吗?

cluster = [z for z,val in enumerate(distances) if val == min(distances)]

我一直试图找到一种无需列表理解的方法来重写它,并且到目前为止已经想出了这个:

for val in enumerate(distances):
    if val == min(distances):
        cluster.append(val)

我知道这不可能是正确的,因为我完全忽略了 z。但我不明白这种列表理解格式是如何工作的,在列表理解的后半部分使用 val 而不是 z

解决方法

它比你想象的更简单。列表推导式中的“值”应该位于 for 循环的最里面。 for 应该放在外面,后面的条件应该放在中间。

cluster = [z for z,val in enumerate(distances) if val==min(distances)]
cluster = []
for z,val in enumerate(distances):
    if val == min(distances):
        cluster.append(z)
,

您在常规 for 循环中的代码是:

cluster = []
for z,val in enumerate(distances):
    if val == min(distances):
        cluster.append(z)
        #or cluster += [z]

列表推导式就是将这个 for 循环压缩成一行。

,

for 循环应该与理解中的循环完全一样。一般来说,这样的理解:

<target> = [<expression> for <loop-var> in <iterable> if <condition>]

分解如下:

<target> = []
for <loop-var> in <iterable>:
    if <condition>:
        <target>.append(<expression>)

就你而言,你有

<target> = cluster
<loop-var> = z,val
<iterable> = enumerate(distances)
<condition> = val == min(distances)
<expression> = z

请注意,循环变量是一个元组,您已将其解包为两个单独的名称。你在理解中正确地做到了这一点,但在循环中却没有:

clusters = []
for z,val in enumerate(distances):
    if val == min(distances):
        cluster.append(val)

通过将循环变量设为 val,您将像 (0,100) 这样的元组与 min(distances) 这样的值进行比较,例如 100,并且总是得到 {{1} } 当然。如果您神奇地得到了 False,那么您的结果列表将看起来像 True 而不是 [(0,100)]

请记住,在每次迭代中计算 [100] 实际上会使您的算法在 min(distances) 时间内运行,而不是它应该运行的 O(n^2) 时间。由于条件 {{1}在循环和理解中的每次迭代中都会评估,我建议分解最小值的计算并进行比较:

O(n)

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

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?