2011-07-30 23 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 

你會得到同樣的錯誤。

相關問題