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 に答える
1

あなたが与えられた他の解決策は、正しく、理解しやすく、優れた Python であり、セットが小さい場合はかなりのパフォーマンスを発揮します。

ただし、インデックスを使用すると、必要なことを (もちろん、メモリとセットアップ時間にかなりのオーバーヘッドがかかります; TANSTAAFL で)はるかに迅速に行うことができます。そして、このインデックスは、データがどれほど大きくなっても一定のパフォーマンスを維持します (すべてを保持するのに十分なメモリがあると仮定します)。多くの検索を行っている場合、これによりスクリプトが大幅に高速化されます。そして、記憶力はそれほど悪くない...

dictキーがインデックス内の項目からの可能なすべての部分文字列setであり、値がその部分文字列を含む項目の である を作成します。

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'])

これは、「で始まる」および「で終わる」一致を含めたり、大文字と小文字を区別しないように、非常に簡単に拡張できます。

同じアイデアのメモリ消費量が少ないバージョンについては、試行を調べてください。

于 2013-08-12T21:43:27.660 に答える