如何解决列表推导式可以使用多个变量吗?
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 举报,一经查实,本站将立刻删除。