python式的写作方式分为两类

python式的写作方式分为两类,python,set,Python,Set,我有两个只包含字符串的集合,我正在尝试编写如下函数: def belongs(setA, setB): return True/False 定义:如果一个集合,比如说setB有一个包含(字符串包含)setA中一个项目的项目,那么我调用setB属于setA。一些例子: setA = set(['apple', 'banana', 'strawberry']) set1 = set(['abcc', 'xyz', 'klm']) # does not b

我有两个只包含字符串的集合,我正在尝试编写如下函数:

def belongs(setA, setB):
   return True/False
定义:如果一个
集合
,比如说
setB
有一个包含(
字符串
包含)setA中一个项目的项目,那么我调用
setB
属于
setA
。一些例子:

setA = set(['apple', 'banana', 'strawberry'])

set1 = set(['abcc', 'xyz', 'klm'])                   # does not belong to setA
set2 = set(['app', 'banaba', 'baba'])                # does not belong to setA
set3 = set(['apples', 'xyz'])                        # belongs to setA
set4 = set(['bananaaa', 'hello', 'world', 'stack'])  # belongs to setA
我当前的代码:

def belongs(set1, set2):
    for i in set1:
        for j in set2:
            if i in j:
                return True
    return False
有没有更好/更符合Python的方法来做同样的事情?

编写函数:

def belongs(set1, set2):
    return any(s1 in s2 for s1 in set1 for s2 in set2)
并测试它:

assert not belongs(setA, set1)
assert not belongs(setA, set2)
assert belongs(setA, set3)
assert belongs(setA, set4)
编写函数:

def belongs(set1, set2):
    return any(s1 in s2 for s1 in set1 for s2 in set2)
并测试它:

assert not belongs(setA, set1)
assert not belongs(setA, set2)
assert belongs(setA, set3)
assert belongs(setA, set4)

检查
setA
中的任何字符串是否是
setB
中任何项的子字符串的问题,即
setB
“是否属于”
setA
可以使用
grep-F
解决

grep-Flf setA set1 set2 set3 set4
打印“属于”
setA
的集合,即在这种情况下,
set3
set4
。该命令构成了原始Unix命令的基础
fgrep
。对于大型输入,它可能比使用嵌套循环的简单解决方案更有效,例如

如果无法安装第三方库;如果需要,您可以尝试使用
re
模块来提高性能:

import re
from itertools import imap

substrings = sorted(setA, key=len, reverse=True) # longest first
found = re.compile("|".join(map(re.escape, substrings))).search
print([any(imap(found, S)) for S in [set1, set2, set3, set4]])
# -> [False, False, True, True]

检查
setA
中的任何字符串是否是
setB
中任何项的子字符串的问题,即
setB
“是否属于”
setA
可以使用
grep-F
解决

grep-Flf setA set1 set2 set3 set4
打印“属于”
setA
的集合,即在这种情况下,
set3
set4
。该命令构成了原始Unix命令的基础
fgrep
。对于大型输入,它可能比使用嵌套循环的简单解决方案更有效,例如

如果无法安装第三方库;如果需要,您可以尝试使用
re
模块来提高性能:

import re
from itertools import imap

substrings = sorted(setA, key=len, reverse=True) # longest first
found = re.compile("|".join(map(re.escape, substrings))).search
print([any(imap(found, S)) for S in [set1, set2, set3, set4]])
# -> [False, False, True, True]

set1
的每一个字符串都是
set2
的每一个字符串的子字符串吗?@dlask No.一个就足够了。您可能希望在不使用额外空间的情况下添加,因为如果我理解正确,您可以简单地将
setA
展平为一组项目。是否
set1
的每一个字符串都是
set2
的每一个字符串的子字符串?@dlask No.一个就够了。您可能希望添加而不使用额外的空间,因为如果我理解正确,您可以简单地将
setA
展平为一组项目。酷的事实:这是一个列表理解,而不是列表理解,这意味着它与原始嵌套的
for
循环一样有效。(这些似乎不是很有名。)@Mauris我不谈论列表理解。OP并没有说更高效的版本,只是说更具Python风格的版本。哇,放松点。我说“酷的事实”。你的回答很好。没有多少人知道生成器表达式的优点,所以我想消除大家的担忧,即这个答案可能比原来的答案慢。哦,是的,我现在明白了。老实说,让我吃惊的是,任何人都会认为生成器的表达速度比普通的循环慢。不管怎样,谢谢你的澄清。@dlask:不是反过来了吗?OP想要s2中的
s1
这是一个很酷的事实:这是一个列表理解,而不是一个列表理解,这意味着它与原始嵌套的
for
循环一样有效。(这些似乎不是很有名。)@Mauris我不谈论列表理解。OP并没有说更高效的版本,只是说更具Python风格的版本。哇,放松点。我说“酷的事实”。你的回答很好。没有多少人知道生成器表达式的优点,所以我想消除大家的担忧,即这个答案可能比原来的答案慢。哦,是的,我现在明白了。老实说,让我吃惊的是,任何人都会认为生成器的表达速度比普通的循环慢。不管怎样,谢谢你的澄清。@dlask:不是反过来了吗?OP需要s2中的s1
s1