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中的s1s1