簡體   English   中英

如何計算此python列表的頻率?

[英]How to calculate the frequency of this python list?

我有一個像這樣的python列表:

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

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

現在我得到一個小清單:

small_list:

['Hello','World']

現在,我需要找出small_list在base_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

但是代碼運行速度非常慢,每秒大約檢查1000條記錄。

我的第一個反應是回答一個愚蠢的答案(盡管可行):

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()函數動態創建代碼。 如果您不確定輸入的內容,則可能有潛在的危險。 這個解決方案是可能解決方案的樂團中的佼佼者:它很有趣,很奏效,但只有一個不好的音符或吱吱聲會使一切變糟。

但是,我最喜歡的潛在解決方案是:

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

這樣更安全,更清潔,並且性能幾乎與第一個解決方案(用於3,000,000條記錄)一樣好。

我發現反向索引可以幫助我:

1.使base_list成為反向索引:

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

2.當我需要計算['Hello','World']的出現次數時。 我只是找到它們的兩個倒排索引並計算它們的通用文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM