有人可以向我解释隐含的“for循环”吗?

时间:2013-03-07 15:10:40

标签: python list-comprehension

我很抱歉,我不明白隐含的循环。所以我想我可以问一下是否会有人为我解释这一点。

我 - 在极大的痛苦之下 - 编写了以下隐含的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 个答案:

答案 0 :(得分:6)

这称为“list comprehension”。

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

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

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

答案 1 :(得分: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]]

答案 2 :(得分:1)

python documentation开始,列表理解可以理解为

  

“包含表达式后跟for子句的括号,然后为零   或更多的或如果条款。结果将是一个新的列表   从评估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]