2013-03-07 24 views
1

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

我 - 下煞费苦心 - 写了下面的隐含的循环:

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种类型的数据点,我想看看我的情节。现在我的数据集当然长于3 :)。我想绘制另一列,所以我需要这些索引。对不起刚才说的,但我认为它可能会分散我的问题。我想绘制文件中的所有数据点,而不仅仅是第一组。

+4

它们被称为* list comprehensions *。谷歌“列表修真教程”中提供了一些指针。 – NPE 2013-03-07 15:11:57

+2

http://docs.python.org/2.7/tutorial/datastructures。html#list-comprehensions – wRAR 2013-03-07 15:13:00

+1

不是正确答案'ind:0,6,1'? – 2013-03-07 15:15:47

回答

6

这就是所谓的“list comprehension”。

你的代码可以变得更简单,不知道为什么你要重新创建列表时,你已经拥有了它:

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

如果你想要更多的指标,只是让order更长。

+0

谢谢,它似乎已经被Robᵩ纠正了。 – unwind 2013-03-07 15:17:02

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

是的,我也是这么读OP的。 – DSM 2013-03-07 15:20:30

+0

对不起,我想做点别的事情。 upvoted为您的烦恼:) – tarrasch 2013-03-07 15:32:12

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] 
相关问题