3

ブール AND 検索で複数のクエリを処理する関数を作成しています。各クエリが発生するドキュメントの辞書があります=query_dict

query_dict.values() のすべての値の共通部分が必要です。

query_dict = {'foo': ['doc_one.txt', 'doc_two.txt', 'doc_three.txt'],
              'bar': ['doc_one.txt', 'doc_two.txt'],
              'foobar': ['doc_two.txt']}

intersect(query_dict)

>> doc_two.txt

交差点について読んできましたが、辞書に適用するのは難しいと感じています。

ご協力いただきありがとうございます!

4

2 に答える 2

13
In [36]: query_dict = {'foo': ['doc_one.txt', 'doc_two.txt', 'doc_three.txt'],
              'bar': ['doc_one.txt', 'doc_two.txt'],
              'foobar': ['doc_two.txt']}

In [37]: reduce(set.intersection, (set(val) for val in query_dict.values()))
Out[37]: set(['doc_two.txt'])

[41]: query_dict = {'foo': ['doc_one.txt', 'doc_two.txt', 'doc_three.txt'], 'bar': ['doc_one.txt', 'doc_two.txt'], 'foobar': ['doc_two.txt']}

set.intersection(*(set(val) for val in query_dict.values()))少し遅いですが、有効なソリューションでもあります。

In [42]: %timeit reduce(set.intersection, (set(val) for val in query_dict.values()))
100000 loops, best of 3: 2.78 us per loop

In [43]: %timeit set.intersection(*(set(val) for val in query_dict.values()))
100000 loops, best of 3: 3.28 us per loop
于 2012-12-10T22:12:35.970 に答える
0

別の方法

first = query_dict.values()[0]
rest = query_dict.values()[1:]
print [t for t in set(first) if all(t in q for q in rest)]
于 2012-12-10T22:30:50.923 に答える