2

次の形式の10**7個のリストを含むリストがあります。

big_list = [[1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40], [10, 23, 33, 45, 46, 47]]

すべてのリストには、6つの固有のintが含まれています。

すべてのリストを別のリストと比較する必要があります。

lst = [1, 3, 4, 10, 23, 46]

リストアイテムの交差が3未満の場合に返します。したがって、newlistは次のようになります。

new_list = [[2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40]]

現在、集合交差点を使用していますが、実行に約30秒かかります

4

3 に答える 3

4
import numpy as np
biglist = [[1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40], [10, 23, 33, 45, 46, 47]]
oldlist = [1, 3, 4, 10, 23, 46]

b = np.array(biglist)
b[np.array([(b == x).any(axis=1) for x in oldlist]).sum(axis=0) < 3]

戻り値

array([[ 2,  3,  4,  5,  6,  7],
       [ 2,  3,  4, 26, 33, 40]])

numpy配列の作成には時間がかかりますが、最後の行は、交差が設定されたリスト内包表記の約2倍の速度です(1e6リストの場合)。

編集:次の行は上記の私のコードよりもさらに高速で、必要なメモリが少なくて済みます:

b[reduce(np.add, ((b == x).any(axis=1).astype(np.int) for x in oldlist)) < 3]
于 2012-06-19T08:21:45.360 に答える
1
>>> big_list = [[1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40], [10, 23, 33, 45, 46, 47]]
>>> normal = set([1, 3, 4, 10, 23, 46])
>>> [x for x in big_list if len(set(x).intersection(normal)) < 3]
[[2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40]]
于 2012-06-19T08:22:33.550 に答える
0

「速い」解決策は、問題の仕様に依存するはずだと思います。たとえば、参照リストが[1、3、4、10、23、46]と同じくらい短い場合、すべてのリストを並べ替えると、10より大きいnumで始まるすべてのリストがすぐにわかります。 11、x、x、...]は、参照を持つ3つを超える共通要素を持ちません。それはすでに多くの比較を節約することができます。

于 2012-06-19T13:14:54.427 に答える