1

在这种情况下,我如何询问字符串模式是否C存在于该集合的任何元素中,而无需删除它们并查看它们?

这个测试失败了,我不知道为什么。我的猜测是 Python 正在检查集合中的任何元素是否 C,而不是任何元素是否包含 C

n [1]: seto = set()

In [2]: seto.add('C123.45.32')

In [3]: seto.add('C2345.345.32')

In [4]: 'C' in seto
Out[4]: False

我知道我可以迭代它们来进行检查:

In [11]: for x in seto:
    if 'C' in x:
        print(x)
   ....:         
C2345.345.32
C123.45.32

但这不是我在这种情况下想要做的。好的,感谢您的帮助!

编辑

对不起,这些是集合操作,而不是我原来的帖子所暗示的列表。

4

3 回答 3

3
'C' in seto

这将检查 seto 的任何成员是否是确切的 string 'S'。不是子字符串,而是那个字符串。要检查子字符串,您需要遍历集合并对每个项目执行检查。

any('C' in item for item in seto)

测试的确切性质可以很容易地改变。例如,如果您想更严格地确定C可以出现的位置:

any(item.startswith('C') for item in seto)
于 2013-08-12T20:35:18.770 回答
2

如果您想使用包含以下内容的项目子集,则将约翰的回答进一步提升一个阶段C

items_with_c = {item for item in seto if 'C' in item}
if items_with_c:
    do_something_with(items_with_c)
else:
    print "No items contain C"
于 2013-08-12T21:03:21.853 回答
1

您获得的其他解决方案是正确的、可理解的和良好的 Python,如果您的集合很小,它们的性能也相当不错。

然而,使用索引可以更快地做你想做的事(当然,在内存和设置时间方面有相当大的开销;TANSTAAFL) 。无论您的数据有多大(假设您有足够的内存来保存所有数据),该索引都会保持恒定的性能。如果您要进行大量查找,这可以使您的脚本更快。而且记忆力也没有想象的那么...

我们将构建一个dict,其中键是索引中项目的每个可能的子字符串set,值是包含该子字符串的项目的 a。

from collections import defaultdict

class substring_index(defaultdict):

    def __init__(self, seq=()):
        defaultdict.__init__(self, set)
        for item in seq:
            self.add(item)

    def add(self, item):
        assert isinstance(item, str)   # requires strings
        if item not in self[item]:     # performance optimization for duplicates
            size = len(item) + 1
            for chunk in range(1, size):
                for start in range(0, size-chunk):
                    self[item[start:start+chunk]].add(item)

seto = substring_index()
seto.add('C123.45.32')
seto.add('C2345.345.32')

print(len(seto))      # 97 entries for 2 items, I wasn't kidding about the memory

现在您可以轻松(并且立即)测试以查看索引中是否有任何子字符串:

print('C' in seto)    # True

或者您可以轻松找到包含特定子字符串的所有字符串:

print(seto['C'])      # set(['C2345.345.32', 'C123.45.32'])

这可以很容易地扩展到包括“开始于”和“结束于”匹配,或者不区分大小写。

对于相同想法的内存密集度较低的版本,请查看Trys

于 2013-08-12T21:43:27.660 回答