1

非常抱歉,我不理解隐式 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 更大。也许我现在想拥有所有索引。我很难过。我必须以某种方式嵌套这些 for 循环。有人可以帮助我理解这足以解决这个问题吗?

一些澄清(对不起,我真的需要更好地表达自己):我本质上想要做的是绘制一个数据集。我想在我的情节上看到这 3 种类型的数据点。现在我的数据集当然长于 3 :)。我想绘制另一列,所以我需要这些索引。抱歉刚才说了,但我认为这可能会分散我的问题。我想绘制文件中的所有数据点,而不仅仅是第一组。

4

3 回答 3

6

这就是所谓的“列表理解”。

您的代码可以变得更简单,但不确定为什么要在已经拥有列表时重新创建它:

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

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

于 2013-03-07T15:12:39.640 回答
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]]
于 2013-03-07T15:20:02.247 回答
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]
于 2013-03-07T15:25:24.490 回答