2015-10-18 105 views
0

是否有可能在List Comprehension重置迭代器變量?

lis[3, 3, 4, 5] 

test = [(tes(x)) for x in range (0, len(lis)) if lis[x] == "abc"] 

重置x或可能轉而使用一些while循環。問題是我想在我完成後在我的lis上運行這個理解列表,而不只是一次迭代。

說我想減少列表中的每個變量。

lis[3, 3, 4, 5] 

lis[2, 2, 3, 4] 

lis[1, 1, 2, 3] 

lis[0, 0, 1, 2] 

然後停止,一旦第一次打零。

+1

你應該解釋你在找什麼作爲輸出 –

+1

你究竟在努力實現什麼? –

+0

你可以添加一個實際的可運行示例嗎?有很多方法可以做到,但是你怎麼做取決於你在做什麼 –

回答

2

,直到你打你的情況,我們在這裏打破的第一個值創下0你可以cycle名單:

from itertools import cycle 

lis = [3, 3, 4, 5] 
for ind, ele in enumerate(iter(lambda: next(cycle(lis)), 0)): 
    lis[ind % len(lis)] -= 1 

print(lis) 
[0, 1, 2, 3] 
+0

+1使用cycle(),這看起來是無限列表循環的正確配方。但由此產生的結構 - lambda-next-cycle沒有吸引力。 – LiMar

+0

@LiMar,如果你沒有使用它lambda,你將無法使用for循環與枚舉,替代是一個計數變量,如果與中斷,我更喜歡使用枚舉 –

+1

這打印'[0,1,2 ,3]'以'[3,3,4,5]'開頭時,因爲你在列表中途停下來。這與問題中給出的例子不同。 –

1

假定你想通過1降低列表中的所有成員,直到較小的成員(S )達到0.1

def decrease_list(lis): 
    def stop(): 
     raise Exception("Stop") 
    try: 
     while True: 
      lis=[e - 1 if e>1 else stop() for e in lis] 
    except: 
     pass 
    return lis 

值測試一下:

In [35]: lis=[20, 12, 11, 10] 

In [36]: decrease_list(lis) 
Out[36]: [10, 2, 1, 0] 

In [33]: lis = [20, 12, 10, 10] 

In [34]: decrease_list(lis) 
Out[34]: [10, 2, 0, 0]