0

次のようなpythonリストのリストがあります:

base_list (About 3,000,000 sub lists):

[
   ['Hello','World','Lucy','Lily'],
   ['Hello','Smith','Simpson','Bart'],
   ....
]

今、私は小さなリストを取得します:

small_list:

['Hello','World']

ここで、base_list に small_list が何回出現するかを調べる必要があります。

出現とは、[1,3] が [1,2,3,4,5] に出現することを意味します。

アップデート

私はこれを試しました:

1.base_list を set のリストに変更します。

2.次に、small_list もセットに変更します。

def get_original_freq(self, actors):
    count = 0
    s = set(actors)
    for row in self.orignal_rows:
      if s.issubset(row):
        count += 1
    return count

しかし、コードの実行は非常に遅く、1 秒あたり約 1000 レコードがチェックされています。

4

2 に答える 2

0

転置インデックスが私を助けてくれることがわかりました:

1.base_listを転置インデックスにします。

{
    'Hello': [1,5,10,8000]
    'World': [1,2,3,5,9]
    ...
}

2. ['Hello'、'World']の出現回数をカウントする必要がある場合。それらの2つの転置インデックスを見つけて、それらの共通ドキュメントを数えます。

于 2012-12-08T14:26:42.357 に答える
0

私の最初の反応は、ばかげた(ただし機能している)答えで答えることです:

def sublistCount(listA, listB):
    if not len(listB):
        return 0
    conditions = ["%s in a" % repr(b) for b in listB]
    comprehension = '[a for a in listA if %s]' % ' and '.join(conditions)
    return len(eval(comprehension))

ここで、listA はリストのリストであり、listB はサブリストです。

文字列のリストを操作する場合でも、これは実際にはかなり高速です。約 1 ~ 2 秒で 3,000,000 個の文字列リストのリストを実行しました。

eval() 関数を使用してオンザフライでコードを作成しているため、私はそれをばかげていると呼びました。入力がどうなるかわからない場合、これは潜在的に危険です。この解決策は、可能性のある解決策のオーケストラのファゴットです。面白いですし、機能しますが、たった 1 つの悪い音やきしみ音がすべてを悪化させます。

ただし、考えられる解決策の中で私のお気に入りは次のとおりです。

def sublistCount(listA, listB):
    b = set(listB)
    matches = [a for a in listA if b.issubset(a)]
    return len(matches)

これはより安全で、よりクリーンで、最初のソリューション (3,000,000 レコードの場合) とほぼ同じように機能します。

于 2012-12-08T11:28:45.220 に答える