Python具有多个Iterables的所有功能

use*_*674 2 python

我有一个文件列表,如果列表中不存在给定的文件名,则需要设置一个标志.所以我有:

if all('FileName' not in f for f in files):
    # set flag
Run Code Online (Sandbox Code Playgroud)

我想扩展此检查以查找多个文件名,因此我创建了一个文件名列表:

file_names = ['FileName', 'FileName2']
Run Code Online (Sandbox Code Playgroud)

在psuedo代码中,我正在寻找:

if all(#all file names in files_names# not in f for f in files):
    # set flag
Run Code Online (Sandbox Code Playgroud)

我还能以某种方式使用内置的所有功能来实现这一点吗?或者我需要将它分成多个语句?

谢谢你的帮助.

fre*_*ish 5

如果我理解正确的话......一种方法是将两者都转换成集合:

files = set(files)
file_names = set(file_names)

if not file_names <= files:
    # set flag
Run Code Online (Sandbox Code Playgroud)

请注意,它<=是子集运算符(快捷方式.issubset).

编辑如果要检查是否所有文件都不在,files则可以使用交集运算符&(或.intersection方法)检查​​两个集合中是否存在共同元素:

if not file_names & files:
    # set flag
Run Code Online (Sandbox Code Playgroud)

如果要保留列表结构,则可以使用临时转换:

if not set(file_names) & set(files):
    # set flag
# file_names is still a list
Run Code Online (Sandbox Code Playgroud)

该解决方案不仅优雅而且高效.在这里阅读更多关于集合:

http://docs.python.org/2/library/sets.html

编辑2如果你想检查名称file_names是否包含在名称中(不像我的解决方案,我只检查名称之间的严格相等),files你可以使用这个:

if all(all(name not in fn for fn in files) for name in file_names):
    # set flag
Run Code Online (Sandbox Code Playgroud)

与您编写的伪代码非常相似.它展示了Python的美妙之处.:D使用集合在这种情况下无关紧要.

  • 不应该有代码将值更改回列表?也许只是`如果没有设置(file_names).issubset(set(files)):`以避免因类型问题导致的错误 (3认同)