我有一个网址列表,并希望删除任何不包含imgur或youtube的网址。
somelist = ['google.com', 'facebook.com', 'imgur.com/9utwj.gif', 'youtube.com/ofskdofk', 'yahoo.com']
approved = ['imgur','youtube']
for app in approved:
matching = [s for s in somelist if app in s]
for match in matching:
somelist.remove(match)
print somelist
返回
['google.com', 'facebook.com', 'yahoo.com']
所以从逻辑上讲,我觉得如果我改变它不是在......中。
matching = [s for s in somelist if app not in s]
它会删除所有不包含已批准网址的内容。但是,它什么都不返回。
答案 0 :(得分:6)
您可以使用any查看已批准的任何字符串是否位于某个列表中的每个网址中:
somelist = ['google.com', 'facebook.com', 'imgur.com/9utwj.gif', 'youtube.com/ofskdofk', 'yahoo.com']
approved = ['imgur','youtube']
somelist[:] = [url for url in somelist if any(sub in url for sub in approved)]
print(somelist)
['imgur.com/9utwj.gif', 'youtube.com/ofskdofk']
any
会在第一场比赛中发生短路,如果你的网址有多个子网,那么它仍会只添加一次网址。
somelist[:]
只是意味着我们使用list comp的效率更改原始列表/对象,而不是使用list.remove.
的常规for循环
答案 1 :(得分:1)
对于有效的代码版本的最小更改,为什么不直接使用您知道的属性(查找匹配项并使用它们执行某些操作),并更改正在执行的操作,即添加到新列表中从旧的删除?即:
newlist = []
for app in approved:
matching = [s for s in somelist if app in s]
for match in matching:
newlist.append(match)
print newlist
然后当你想做更好的事情时,你可以把它变成一个没有副作用的功能......
[编辑:我看到这与上面的答案基本相同,它与我的交叉线!去投票那一个。 :-))
答案 2 :(得分:0)
简明扼要:
results = [url for url in somelist for app in approved if app in url]
答案 3 :(得分:0)
这个是OR,没有第二个FOR循环。同样的结果。
#!/usr/bin/python
somelist = ['google.com', 'facebook.com', 'imgur.com/9utwj.gif', 'youtube.com/ofskdofk', 'yahoo.com']
approved = ['imgur','youtube']
L=[]
for s in somelist:
if s.find('imgur') != -1 or s.find('youtube') != -1:
L.append(s)
somelist=L
print somelist
输出
['imgur.com/9utwj.gif', 'youtube.com/ofskdofk']
答案 4 :(得分:-2)
#!/usr/bin/python
somelist = ['google.com', 'facebook.com', 'imgur.com/9utwj.gif', 'youtube.com/ofskdofk', 'yahoo.com']
approved = ['imgur','youtube']
L=[]
for s in somelist:
for app in approved:
if s.find(app) != -1:
L.append(s)
somelist=L
print somelist
输出
['imgur.com/9utwj.gif', 'youtube.com/ofskdofk']