52

私は次のように構築された大きな辞書を持っています:

programs['New York'] = 'some values...' 
programs['Port Authority of New York'] = 'some values...' 
programs['New York City'] = 'some values...'
...

programsキーが「new york」(大文字と小文字を区別しない) に言及しているすべての要素を返すにはどうすればよいですか? 上記の例では、3 つの項目すべてを取得したいと考えています。

編集:辞書は非常に大きく、時間の経過とともに大きくなると予想されます。

4

5 に答える 5

96
[value for key, value in programs.items() if 'new york' in key.lower()]
于 2012-05-07T14:58:48.143 に答える
6

遅すぎることが判明するまでは、 mensiによって与えられた力ずくの方法を使用する必要があります。

これは、データを複製してルックアップを高速化するものです。これは、単語全体のみを検索する場合にのみ機能します。つまり、「york」と「yorks」は異なる単語であるため、「New Yorks Best Bagels」で一致させる必要はありません。

words = {}
for key in programs.keys():
    for w in key.split():
        w = w.lower()
        if w not in words:
            words[w] = set()
        words[w].add(key)


def lookup(search_string, words, programs):
    result_keys = None
    for w in search_string.split():
        w = w.lower()
        if w not in words:
            return []
        result_keys = words[w] if result_keys is None else result_keys.intersection(words[w])
    return [programs[k] for k in result_keys]

単語が連続している必要がある場合 (つまり、"York New" が一致してはならない)、総当たり法を の短いリストに適用できますresult_keys

于 2012-05-07T16:11:53.613 に答える
5

事前にすべての部分文字列を生成し、それらをそれぞれのキーにマップできます。

#generates all substrings of s.
def genSubstrings(s):
    #yield all substrings that contain the first character of the string
    for i in range(1, len(s)+1):
        yield s[:i]
    #yield all substrings that don't contain the first character
    if len(s) > 1:
        for j in genSubstrings(s[1:]):
            yield j

keys = ["New York", "Port Authority of New York", "New York City"]
substrings = {}
for key in keys:
    for substring in genSubstrings(key):
        if substring not in substrings:
            substrings[substring] = []
        substrings[substring].append(key)

次に、クエリを実行substringsして、その部分文字列を含むキーを取得できます。

>>>substrings["New York"]
['New York', 'Port Authority of New York', 'New York City']
>>> substrings["of New York"]
['Port Authority of New York']

長所:

  • 部分文字列によるキーの取得は、辞書にアクセスするのと同じくらい高速です。

短所:

  • 生成substringsには、プログラムの開始時に 1 回限りのコストが発生し、 のキーの数に比例して時間がかかりますprograms
  • substringsのキーの数にほぼ比例してprograms増加し、スクリプトのメモリ使用量が増加します。
  • genSubstringsキーのサイズに対して O(n^2) のパフォーマンスがあります。たとえば、「Port Authority of New York」は 351 個の部分文字列を生成します。
于 2012-05-07T15:50:31.043 に答える
3

iteritemsおよび ジェネレーター式はこれを行います。

d={'New York':'some values',
    'Port Authority of New York':'some more values',
    'New York City':'lots more values'}

print list(v for k,v in d.iteritems() if 'new york' in k.lower())    

出力:

['lots more values', 'some more values', 'some values']
于 2012-05-07T15:03:38.210 に答える