2017-07-03 128 views
0

HEJ大家,While循環被忽略

劇本的想法是從我公司的網站目錄頁面抓取圖像鏈接並將其更改爲圖像鏈接具有更高的分辨率和濾波器及圖像格式,其中在鏈接本身中找到變量來過濾,在這種情況下是大寫P.然後,通過鏈接生成一個csv。

csv的轉換,過濾和寫入工作正常,但我的問題是,我不想要所有的80個產品,我只想要8個在列表中nl

links列表包含這樣一個https://rndr.mywebsite.com/media/catalog/product/seo-cache/x386/19/95/19-95-101P/How-Hard-You-Hit-Butcher-Billy-Premium-Poster.jpg

元素:變量比和素材(inputnumber-1)通過命令行輸入定義。假設輸入是ratio = Pcreatives = 9-1

NOTE2:爲了更快速的測試,到目前爲止,鏈接列表限制了15個元素。

nl= [] 
string1= "https://rndr.mywebsite.com/media/catalog/product/cache/x800/" 
string2= ".jpg" 

while len(nl) <= creatives:       
    for index in range(len(links)): 
     if "P" in "".join(links[index].split("/", 12)[10]) and "P" in ratio: 
      print("YEAH", len(nl)) 
      nl.extend([string1 + "/".join(links[index].split("/", 11)[8:11]) + string2]) 
     else: 
      print ("Ups", len(nl)) 
print (nl) 

實際產量

('YEAH', 0) 
('YEAH', 1) 
('YEAH', 2) 
('YEAH', 3) 
('Ups', 4) 
('YEAH', 4) 
('YEAH', 5) 
('Ups', 6) 
('YEAH', 6) 
('YEAH', 7) 
('YEAH', 8) 
('YEAH', 9) 
('YEAH', 10) 
('YEAH', 11) 
('YEAH', 12) 
[https://rndr.mywebsite.com/media/catalog/product/cache/x800/19/95/19-95-101P.jpg, transformed-link2,...,transformed-link12] 

正如你所看到的過濾和轉化工作正常,但不必在列表nl 9個鏈接後,應立即停止。

+0

不一定,因爲你在做循環。 –

+0

你正在用另一個列表擴展'nl',我不知道在另一個循環內有多大的尺寸。在下一次檢查完成之前,您可能會超出限制。 –

回答

2

正如Coldspeed所述,在內部循環中,您將向nl添加一批物品,從而超出限制。爲了解決這個問題,你可以擺脫while循環,做這個:

for index in range(len(links)): 
    if "P" in "".join(links[index].split("/", 12)[10]) and "P" in ratio: 
     print("YEAH", len(nl)) 
     nl.append(string1 + "/".join(links[index].split("/", 11)[8:11]) + string2) 
     if len(nl) > creatives: 
      break 
    else: 
     print ("Ups", len(nl)) 
+0

對不起,沒有看到你已經發布。將你的答案與我的聯繫起來:) –

+0

好的,你的方式比我最初的想法更聰明。 感謝您的回答並修復我的代碼:) –

1

添加了幾個這樣的打印報表,可以幫助你弄清楚到底是怎麼回事:

while len(nl) <= creatives:  
    print('outer loop')     
    for index in range(len(links)): 
     print('inner loop') 
     ... 

你在這裏有一個嵌套循環。會發生什麼是,在內部循環內部,外部循環的條件不會被檢查,直到內部循環完成迭代。你需要做的是在內部循環中放置一個明確的break

查看this answer尋求解決方案。 :)

+0

啊,謝謝你解釋我在那裏建造的東西。我已經擺弄了休息時間,但並沒有意識到它檢查病情的問題。 將看看你提供的鏈接:) –

+0

@NilsOle它鏈接到你已經接受的Błotosmętek的解決方案。我在這裏的工作已經完成。 –

1

你正在做while循環內的for循環。 while循環只會在完成第一個for循環時檢查其條件,此時您已經循環遍歷links中的每個元素。

E.g.

i = 0 
while i < 10: 
    for z in range(20): 
     i = z 
     print(i) 

將一直打印到19,因爲while循環的前提條件只有在內循環結束時纔會被檢查。

+0

非常感謝您解釋我的錯誤是什麼,並給出實際解釋我的代碼中發生了什麼:) –