有人能解释一下隐式的“for循环”吗?

1 投票
3 回答
13525 浏览
提问于 2025-04-17 18:16

我很抱歉,我不太理解隐式循环。所以我想问问有没有人能为我解释一下这个概念。

我费了很大劲写了下面这个隐式循环:

ueberdata= [1,5,2,6,1,2,3,4,1,3,5,6]
order = [1,3,5]
ind = [list(ueberdata).index(i) for i in order]

这个代码可以给我按顺序返回第一次出现的元素的索引。

ind : 0,6,2

到这里为止还不错。现在我想扩展这个例子。也许ueberdata会更大。也许我现在想要获取所有的索引。但我卡住了。我需要以某种方式嵌套这些循环。有人能帮我理解到足够解决这个问题吗?

再补充一下说明(抱歉,大家,我真的需要更好地表达自己): 我想做的基本上是绘制一个数据集。我有这三种类型的数据点想在图上显示。现在我的数据集当然比这三个要长 :)。而且我还想绘制另一列,所以我需要那些索引。抱歉现在才说这些,但我觉得这可能会分散大家对我问题的注意。我想绘制文件中的所有数据点,而不仅仅是第一组。

3 个回答

1

根据Python文档,列表推导式可以理解为:

“用括号包裹的表达式,后面跟着一个for语句,然后可以有零个或多个for或if语句。结果将是一个新列表,这个列表是通过在for和if语句的上下文中计算表达式得到的。”

[list(ueberdata).index(i) for i in order]

在某种意义上,这和

ind=[]
for i in order:
  ind.append(list(ueberdata).index(i))

是类似的。它不依赖于列表的大小,这回答了你的第一个问题。

如果想获取所有的索引,我会使用一个辅助函数,像这样:

lambda value : [x for x in range(len(ueberdata)) if ueberdata[x] == value]
2

如果你想要获取所有的索引,可以这样做:

>>> ueberdata= [1,5,2,6,1,2,3,4,1,3,5,6]
>>> order = [1,3,5]
>>> [[i for i,j in enumerate(ueberdata) if j==k] for k in order]
[[0, 4, 8], [6, 9], [1, 10]]

如果列表可能会很大,使用一个辅助的 defaultdict 会更有效率。

>>> from collections import defaultdict
>>> D = defaultdict(list)
>>> orderset = set(order)
>>> for i,j in enumerate(ueberdata):
...  if j in orderset:
...   D[j].append(i)
... 
>>> [D[i] for i in order]
[[0, 4, 8], [6, 9], [1, 10]]
6

这叫做“列表推导式”。

你的代码可以更简单一点,不太明白你为什么要重新创建一个列表,明明你已经有了:

ind = [uberdata.index(i) for i in order]

如果你想要更多的索引,只需要把 order 的长度增加就可以了。

撰写回答