2011-07-30 21 views
0

列出的不同长度的每个循环多种分配:为什么我不允许有就像我被允许这样做在使用Python

(编辑 - 我不能要么做到这一点,抱歉搞砸了,但无论如何,我想我的问题更多的是对的,为什么我不能对每个循环做的如何去在一个循环中并行作业)

for (x,i) in ([0,1,2],[3,4,5]): 
    # do something 

线(不同的列表长度)

for (x,i) in ([4,6,5,7,8,9],[1,2,3]): 
    # do something 

我知道你会得到一个“ValueError:太多的值来解压缩”,但为什么当我完成迭代时循环不会停止?

一个真正的使用,这将是这样的事情,我试图做

for (keys,i) in (sorted(dic.keys(),key=custom_sort), range(10)): 
    print dic[keys] 

在那里我整理字典以及印刷只有前10次顶级的结果(假设词典中数百个键) - 我只想要前10名的结果。

由于这种语法无论如何都是不允许的,那么下一个最好的做法是什么呢?

感谢

回答

2

对于这种东西,itertools是你的朋友。

在你的情况,itertools.islice()会做的伎俩:

import itertools 
for key in itertools.islice(sorted(dict.keys(), key=custom_sort), 10): 
    # Only the first 10 keys are processed. 

另外,如果你需要的指数,以及使用zipitertools.izip

for i, key in zip(range(10), sorted(dict.keys(), key=custom_sort)): 
    # i will be 0, 1, ..., 9 
+0

+1:你清楚地知道你的Python食谱比我做得更好! – Johnsyweb

+0

谢谢 - 这工作 – Raja

1

你不允许这样做:

for (x,i) in ([0,1,2],[3,4,5]): 
    # do something 
+0

我发誓我在发布这个问题之前在解释器中尝试过,现在它不起作用,该死!编程的规律是一个苛刻的情妇 – Raja

+0

所以无论如何,什么可能是最好的方式去循环平行分配? – Raja

+1

这是一个答案或评论? –

2

不能做你在第一个例子中做了什么 - 它给出了完全相同的错误。所以错误不是来自不同长度的列表。

我想你的意思做的是这样的:

for (x,i) in zip([0,1,2],[3,4,5]): 

与不同长度

名单
>>> for x, i in zip([4,6,5,7,8,9],[1,2,3]): 
... print x, i 
... 
4 1 
6 2 
5 3 
+0

这要简单得多,谢谢 – Raja

1
for (x,i) in ([0,1,2],[3,4,5]): 
    # do something 

威尔raise作品一样好:

ValueError: too many values to unpack 

它看起来l IKE你正在试图做到这一点:

>>> import itertools as i 
>>> first,second = [4,6,5,7,8,9],[1,2,3] 
>>> for x,i in i.izip(first, second): 
...  print x, i 
... 
4 1 
6 2 
5 3 

itertools看一看,特别是izip()。其中有很多善意......例如,islice()函数,Ferdinand Beyer's answer和其他recipes

0

for遍历容器中的元素。每个元素都是包含两个以上元素的单个列表。

试试这个:

(x, y) = ([0, 1, 2], [3, 4, 5]) 

这是你想要的。不需要for

请注意,您声明作品的第一个示例并不实际。你不能这样做:

for (x, y) in ([0, 1, 2], [3, 4, 5]): 
    pass 

你会得到同样的错误。

相关问题