2010-09-13 48 views
8

基本上,我需要一種方法來將控制返回到for循環的開始處,並且在滿足特定條件時採取動作後實際重新開始整個迭代過程Python - 重啓for循環的方式,類似while循環的「continue」?

我想要做的是這樣的:

for index, item in enumerate(list2): 
    if item == '||' and list2[index-1] == '||': 
     del list2[index] 
     *<some action that resarts the whole process>* 

這樣,如果[ '莓', '||', '||', '||','煎餅]裏面該清單,我將結束:

['berry','||','pancake']而不是。

謝謝!

+0

你是詢問嵌套的循環? '而某事:爲...'?如果是這樣,那麼如此複雜?請發佈代碼示例以顯示您正在做什麼。 – 2010-09-13 22:41:28

+0

你能否提供一些示例代碼,以便我們能夠弄清楚你在問什麼。 「繼續」適用於「for」和「while」循環。看起來你想要不同的東西。 – 2010-09-13 22:43:11

+5

繼續不會爲while循環執行此操作,而只是跳過循環體的其餘部分,就像循環一樣。嘗試重新描述你的問題來描述你想要完成的事情,而不是你想如何完成它 – 2010-09-13 22:43:50

回答

30

我不確定「重新啓動」是什麼意思。你想從頭開始迭代,還是直接跳過當前迭代?

如果是後者,那麼for循環支持continue就像while循環做:

for i in xrange(10): 
    if i == 5: 
    continue 
    print i 

以上將打印的數字從0到9,除了5

如果你談到從for循環開始重新開始,除了「手動」,沒有辦法做到這一點,例如通過將其包裝在while循環中:

should_restart = True 
while should_restart: 
    should_restart = False 
    for i in xrange(10): 
    print i 
    if i == 5: 
     should_restart = True 
     break 

上面將打印數字從0到5,然後再從0開始,等等無限期(不是一個很好的例子,我知道)。

+0

非常感謝!第二個解決方案非常出色。 – Georgina 2010-09-13 22:54:56

+0

沒問題。另外看看Nathon的回答,它使用'for'的'else'子句來清理/簡化版本。 – 2010-09-13 23:02:45

+1

哈哈那第二個例子聞起來像C++如此糟糕 – 2011-08-10 05:07:43

2

Continue將適用於任何循環。

+0

但是我正在尋找一種方式來重新啓動for循環索引更好的完全控制...返回到狀態它剛剛開始。 – Georgina 2010-09-13 22:39:35

+0

這個很好的參考:http://en.wikibooks.org/wiki/Python_Programming/Flow_control#Breaking.2C_continuing_and_the_else_clause_of_loops – 2010-09-13 22:41:49

2

continue也適用於for循環。

>>> for i in range(3): 
...  print 'Before', i 
...  if i == 1: 
...    continue 
...  print 'After', i 
... 
Before 0 
After 0 
Before 1 
# After 1 is missing 
Before 2 
After 2 
+0

感謝 - 這是很好的瞭解!但是我正在尋找一種方法來完全重啓for循環...控制返回到開始時的狀態。 – Georgina 2010-09-13 22:40:27

24
while True: 
    for i in xrange(10): 
     if condition(i): 
      break 
    else: 
     break 

這將做你看起來想要的。爲什麼你會想要這樣做是另一回事。也許你應該看看你的代碼,並確保你沒有錯過一個明顯而簡單的方法來做到這一點。

+0

由於澄清(因爲'爲:...其他:'可能是一種混亂,這也有'break's在兩個嵌套循環):如果條件爲真,則跳出'for'循環,這意味着它跳過該循環的'else'部分,這意味着它回到'while'循環的頂部。如果條件總是爲false,則完成'for'循環,進入'else'部分,並從'while'循環中'break'。 – 2016-09-02 17:00:34

5

一些動作是resarts整個過程

一個貧窮的方式思考的算法。

你只是過濾,即刪除重複。

而且 - 在Python中 - 你最幸福的製作副本,而不是試圖做del。一般來說,幾乎沒有電話使用del

def unique(some_list): 
    list_iter= iter(some_list) 
    prev= list_iter.next() 
    for item in list_iter: 
     if item != prev: 
      yield prev 
      prev= item 
    yield prev 

list(unique(['berry','||','||','||','pancake'])) 
+0

他正在刪除相鄰的重複項目,要清楚。看起來這就是你的方法所做的事情,但這不是「獨特」這個名稱的意思。 – 2010-09-13 22:58:10

+0

@David M .:雖然如此,這是一種「負面」評論。 「獨特不合適」。好的。你有什麼建議?你可以提出一個「積極」的評論,提出一些建議嗎? – 2010-09-13 23:15:14

+0

當然,如果你需要那種溺愛。 (對於它的價值,我upvoted你的答案。我並不想給你撕了下來,只是不想讓OP混淆)的'itertools'食譜叫它'unique_justseen',也許'unique_adjacent'會更好。 – 2010-09-13 23:56:12

4

必然itertools版本,因爲它只是向我走來:

from itertools import groupby 

def uniq(seq): 
    for key, items in groupby(seq): 
     yield key 

print list(uniq(['berry','||','||','||','pancake'])) # ['berry','||', 'pancake'] 
# or simply: 
print [key for key, items in groupby(['berry','||','||','||','pancake'])] 
+0

+1,我會剛剛返回一個生成器表達式 – 2010-09-13 23:34:33

0
def remove_adjacent(nums): 
    return [a for a,b in zip(nums, nums[1:]+[not nums[-1]]) if a != b] 

example = ['berry','||','||','||','pancake'] 

example = remove_adjacent(example) 
print example 
""" Output: 
['berry', '||', 'pancake'] 
""" 

並以此爲重複Remove adjacent duplicate elements from a list

1

的方式正如你所看到的回答你的問題線索到一些相當複雜的代碼。通常一個更好的方法可以發現,這就是爲什麼這樣的結構是不是內置到語言

如果您在使用itertools,可以考慮使用這種循環,而不是不舒服。不僅比重新啓動for循環更容易遵循,而且效率更高,因爲它不會浪費時間重新檢查已經傳遞的項目。

L = ['berry','||','||','||','pancake'] 
idx=1 
while idx<len(L): 
    if L[idx-1]==L[idx]: 
     del L[idx] 
    else: 
     idx+=1