我有一个包含一些文件名(位置)的列表,我想要做的是我想删除列表位置中的每个元素。
条件:如果文件名以排除列表中的任何字符串开头,则不要打印文件名。
locations = ['/data/mybackup/data/fil1',
'/data/mybackup/data/fil2',
'/data/mybackup/data/fil3',
'/data/mybackup/song/fil1',
'/data/mybackup/song/fil2',
'/data/mybackup/song/fil3',
'/data/archive/song/fil1',
'/data/archive/song/fil2',
'/data/archive/song/fil3',
'/data/archive/data/fil1',
'/local/archive/data/fil2',
'/local/archive/data/fil3',
'/ebboks/wordpress/fil1',
'/ebooks/wordpress/fil2',
'/ebooks/wordpress/fil3']
excludes = [ '/data/archive/', '/data' , '/ebooks/' ]
for location in locations:
for exclude in excludes:
if not location.startswith(exclude):
print(location)
break
结果:
/data/mybackup/data/fil1
/data/mybackup/data/fil2
/data/mybackup/data/fil3
/data/mybackup/song/fil1
/data/mybackup/song/fil2
/data/mybackup/song/fil3
/local/archive/data/fil2
/local/archive/data/fil3
/ebboks/wordpress/fil1
/ebooks/wordpress/fil2
/ebooks/wordpress/fil3
我的结果仍然是以' / data'
开头的文件名我的代码出了什么问题?
答案 0 :(得分:4)
条件:如果文件名以任意字符串开头,请不打印文件名 排除清单。
使用all()
功能:
for location in locations:
if all(not location.startswith(e) for e in excludes):
print(location)
输出:
/local/archive/data/fil2
/local/archive/data/fil3
/ebboks/wordpress/fil1
答案 1 :(得分:3)
str.startswith
接受tuple
个参数进行检查,以避免额外的循环检查和对排序比较的担忧,因此您可以使用:
exc = tuple(excludes)
# Or start with: excludes = ('/data/archive/', '/data' , '/ebooks/') instead
for location in locations:
if not location.startswith(exc):
print(location)
这给了你:
/local/archive/data/fil2
/local/archive/data/fil3
/ebboks/wordpress/fil1
答案 2 :(得分:2)
对于location
,我要说"/data/mybackup/data/fil1"
和exclude
是"/data/archive"
,location
变量不以"/data/archive"
开头。
由于您的"/data"
列表中包含excludes
值,因此您无需添加以"/data"
开头的其他路径。因此,如果您定义excludes = ["/data", "/ebooks"]
,则没有问题。
答案 3 :(得分:1)
因为您先检查/data/archive/
;它允许所有不以/data/archive/
开头的条目基本上跳过对/data
的检查。
你可以这样做:
>>> excludes = tuple(excludes)
>>> filter(lambda x: not x.startswith(excludes), locations)
['/local/archive/data/fil2', '/local/archive/data/fil3', '/ebboks/wordpress/fil1']
答案 4 :(得分:1)
在打印位置之前,您必须检查所有排除项。
尝试更改此内容:
for location in locations:
for exclude in excludes:
if not location.startswith(exclude):
print(location)
break
要:
def valid(location):
for exclude in excludes:
if location.startswith(exclude):
return False
return True
for location in locations:
if valid(location):
print(location)
答案 5 :(得分:0)
尝试列表理解:
>>> [location for location in locations \
if not location.startswith(tuple(excludes))]
输出:
['/local/archive/data/fil2', '/local/archive/data/fil3', '/ebboks/wordpress/fil1']
或filter
如果您更喜欢函数式编程来回答@mshsayem