2014-01-30 98 views
5

我是Python的新手,對使用for循環更新列表有疑問。這裏是我的代碼:For循環中的Python列表

urls = ['http://www.city-data.com/city/javascript:l("Abbott");' , 'http://www.city-data.com/city/javascript:l("Abernathy");' , 

'http://www.city-data.com/city/Abilene-Texas.html' ,'http://www.city-data.com/city/javascript:l("Abram-Perezville");' , 

'http://www.city-data.com/city/javascript:l("Ackerly");' , 'http://www.city-data.com/city/javascript:l("Adamsville");', 

'http://www.city-data.com/city/Addison-Texas.html'] 

for url in urls: 
    if "javascript" in url: 
     print url 
     url = url.replace('javascript:l("','').replace('");','-Texas.html') 
     print url 

for url in urls: 
    if "javascript" in url: 
     url = url.replace('javascript:l("','').replace('");','-Texas.html') 
print "\n" 
print urls 

我用第一個for循環來檢查語法是否正確,它工作正常。但第二個for循環是我想要使用的代碼,但它不能正常工作。我將如何使用第二個for循環全局更新列表,以便我可以在for循環之外打印或存儲更新的列表?

回答

7

可以使用它們的索引更新列表項:

for i, url in enumerate(urls): 
    if "javascript" in url: 
     urls[i] = url.replace('javascript:l("','').replace('");','-Texas.html') 

另一種方法是使用列表理解:

def my_replace(s): 
    return s.replace('javascript:l("','').replace('");','-Texas.html') 

urls[:] = [my_replace(url) if "javascript" in url else url for url in urls] 

這裏urls[:]手段替換爲新urls列表的所有項目由列表理解創建的列表。

您的代碼無法正常工作的原因是您要將變量url分配給其他內容,並且將某個對象的引用更改爲指向其他引用不會影響其他引用。所以,你的代碼就相當於:

>>> lis = ['aa', 'bb', 'cc'] 
>>> url = lis[0]     #create new reference to 'aa' 
>>> url = lis[0].replace('a', 'd') #now assign url to a new string that was returned by `lis[0].replace` 
>>> url 
'dd' 
>>> lis[0] 
'aa' 

還要注意的是str.replace總是返回字符串的一個新副本,它永遠不會改變原來的字符串,因爲字符串在Python是不可改變的。如果lis[0]是一個列表,並且您使用.append.extend等對其進行了任何就地操作,那麼這也會影響原始列表。

+0

謝謝,我發現這也有幫助。我是新手,來到這裏做一些學習:-)在我的研究中,我想我在代碼中發現了一個小錯誤。 'return s.url.replace('javascript:l(「','')。replace('」);',' - Texas.html')' - should - 'return s.replace('javascript :l('','')。replace('「);',' - Texas.html')' –

+0

@Darren尼斯抓住了,修正了這個問題。 :-) –

+0

是需要更換列表理解時的'urls [:]'?它不會返回一個新列表嗎? –