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

2024-04-25 07:44:56 发布

您现在位置:Python中文网/ 问答频道 /正文

很抱歉,我不明白隐式for循环。所以我想我可以问问是否有人会为我多解释一点。

我煞费苦心地写了以下隐含for循环:

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,11

到目前为止还不错。现在我想扩展这个例子。也许ueberdata更大。也许我现在想要所有的指数。我被难住了。我得把它们套成圈。有人能帮我理解这个问题吗?

一些澄清(抱歉,伙计们,我真的需要更好地表达自己): 我真正想做的是绘制一个数据集。我有这三种类型的数据点,我想在我的曲线图上看到。现在我的数据集当然超过了3:)。我想绘制另一列,所以我需要这些索引。很抱歉刚才这么说,但我想这可能会分散我的注意力。我想打印文件中的所有数据点,而不仅仅是第一组。


Tags: 数据in类型forindex绘制order指数
3条回答

python documentation中,列表理解可以读取为

"brackets containing an expression followed by a for clause, then zero or more for or if clauses. The result will be a new list resulting from evaluating the expression in the context of the for and if clauses which follow it."

[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]

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

>>> 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]]

如果列表可以很大,那么创建helper 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]]

这叫做“list comprehension”。

您的代码可能会变得更简单,不确定为什么要在已有列表的情况下创建列表:

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

如果您想要更多的索引,只需延长order

相关问题 更多 >