sto*_*rap 5 python string loops list
我是Python的新手,并且有一个关于使用for循环更新列表的问题.这是我的代码:
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
Run Code Online (Sandbox Code Playgroud)
我使用第一个for循环来检查语法是否正确,并且它工作正常.但第二个for循环是我想要使用的代码,但它无法正常工作.如何使用第二个for循环全局更新列表,以便我可以在for循环之外打印或存储更新的列表?
您可以使用其索引更新列表项:
for i, url in enumerate(urls):
if "javascript" in url:
urls[i] = url.replace('javascript:l("','').replace('");','-Texas.html')
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用列表理解:
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]
Run Code Online (Sandbox Code Playgroud)
这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'
Run Code Online (Sandbox Code Playgroud)
另请注意,str.replace始终返回一个新的字符串副本,它永远不会更改原始字符串,因为字符串在Python中是不可变的.如果lis[0]是一个列表,并使用你上执行任何就地操作.append,.extend等等,那么这将有原来的名单受到影响.