sir*_*rex 97 python list inclusion
我发现,有一个相关的问题,关于如何查找列表中是否存在至少一个项目:
如何检查下列项目之一是否在列表中?
但是,查找列表中是否存在所有项目的最佳和pythonic方法是什么?
通过文档搜索,我找到了这个解决方案:
>>> l = ['a', 'b', 'c']
>>> set(['a', 'b']) <= set(l)
True
>>> set(['a', 'x']) <= set(l)
False
Run Code Online (Sandbox Code Playgroud)
其他解决方案是:
>>> l = ['a', 'b', 'c']
>>> all(x in l for x in ['a', 'b'])
True
>>> all(x in l for x in ['a', 'x'])
False
Run Code Online (Sandbox Code Playgroud)
但在这里你必须做更多的打字.
还有其他解决方案吗?
Gle*_*ard 125
<=Python中的运算符通常不会覆盖与"小于或等于"明显不同的含义.标准库执行此操作是不寻常的 - 它闻起来像遗留API.
使用等效且更清楚命名的方法set.issubset.请注意,您不需要将参数转换为集合; 如果需要,它会为你做的.
set(['a', 'b']).issubset(['a', 'b', 'c'])
Run Code Online (Sandbox Code Playgroud)
tsi*_*lar 60
我可能会set以下列方式使用:
set(l).issuperset(set(['a','b']))
Run Code Online (Sandbox Code Playgroud)
或者反过来说:
set(['a','b']).issubset(set(l))
Run Code Online (Sandbox Code Playgroud)
我发现它更具可读性,但可能会过度杀戮.集合对于计算集合之间的并集/交集/差异特别有用,但在这种情况下它可能不是最佳选择...
mar*_*eau 11
我喜欢这两个,因为它们看起来最合乎逻辑,后者更短,可能更快(这里使用set文字语法显示已经 向后移植到Python 2.7):
all(x in {'a', 'b', 'c'} for x in ['a', 'b'])
# or
{'a', 'b'}.issubset({'a', 'b', 'c'})
Run Code Online (Sandbox Code Playgroud)
如果您的列表包含这样的重复项怎么办:
v1 = ['s', 'h', 'e', 'e', 'p']
v2 = ['s', 's', 'h']
Run Code Online (Sandbox Code Playgroud)
集合不包含重复项。因此,以下行返回 True。
set(v2).issubset(v1)
Run Code Online (Sandbox Code Playgroud)
要计算重复项,您可以使用以下代码:
v1 = sorted(v1)
v2 = sorted(v2)
def is_subseq(v2, v1):
"""Check whether v2 is a subsequence of v1."""
it = iter(v1)
return all(c in it for c in v2)
Run Code Online (Sandbox Code Playgroud)
因此,以下行返回 False。
is_subseq(v2, v1)
Run Code Online (Sandbox Code Playgroud)