【问题标题】:Python: How to find presence of every list item in stringPython:如何查找字符串中每个列表项的存在
【发布时间】:2010-11-29 21:34:57
【问题描述】:

在路径中查找每个目录名称['spam', 'eggs'] 存在的最pythonic方法是什么,例如"/home/user/spam/eggs"

用法示例(不起作用,但解释了我的情况):

dirs = ['spam', 'eggs']
path = "/home/user/spam/eggs"
if path.find(dirs):
    print "All dirs are present in the path"

谢谢

【问题讨论】:

  • 你的输出应该是什么?

标签: python list path


【解决方案1】:

set.issubset:

>>> set(['spam', 'eggs']).issubset('/home/user/spam/eggs'.split('/'))
True

【讨论】:

    【解决方案2】:

    也许这就是你想要的?

    dirs = ['spam', 'eggs']
    path = "/home/user/spam/eggs"
    present = [dir for dir in dirs if dir in path]
    

    【讨论】:

    • 如果您想查找列表中的哪些项目存在于字符串中,这实际上是一个很好的方法。对于所有项目都存在,当然需要一个额外的步骤来比较当前与目录。
    【解决方案3】:

    看起来你想要类似...的线条:

    if all(d in path.split('/') for d in dirs):
       ...
    

    这种单行样式效率低下,因为它为每个 d 保持拆分路径(并且拆分创建一个列表,而一个集合更适合成员检查)。将其制成 2 线:

    pathpieces = set(path.split('/'))
    if all(d in pathpieces for d in dirs):
       ...
    

    大大提高了性能。

    【讨论】:

      【解决方案4】:

      使用生成器的单行程序(使用文本查找并且不将名称视为与文件系统有关的任何事情 - 我并不完全清楚您的请求)

      [x for x in dirs if x in  path.split( os.sep )]
      

      【讨论】:

        【解决方案5】:
        names = ['spam', 'eggs']
        dir   = "/home/user/spam/eggs"
        
        # Split into parts
        parts = [ for part in dir.split('/') if part != '' ]
        
        # Rejoin found paths
        dirs  = [ '/'.join(parts[0:n]) for (n, name) in enumerate(parts) if name in names ]
        

        编辑:如果您只想验证所有目录是否存在:

        parts = "/home/user/spam/eggs".split('/')
        
        print all(dir in parts for dir in ['spam', 'eggs'])
        

        【讨论】:

        • 这显然可以工作,但对于这样一个简单的任务来说看起来很复杂。无论如何,谢谢:)
        猜你喜欢
        • 2021-10-26
        • 2015-10-05
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 2015-08-03
        • 2023-04-03
        • 2011-08-31
        相关资源
        最近更新 更多