从列表中删除满足某些条件的某些元素

时间:2017-10-14 17:42:29

标签: python python-3.x list

我有一个包含一些文件名(位置)的列表,我想要做的是我想删除列表位置中的每个元素。

条件:如果文件名以排除列表中的任何字符串开头,则不要打印文件名。

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'

开头的文件名

我的代码出了什么问题?

6 个答案:

答案 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