如何计算这个python列表的频率?

时间:2012-12-08 09:18:35

标签: python

我有一个像这样的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条记录。

2 个答案:

答案 0 :(得分: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()函数动态创建代码。如果你不确定你的输入是什么,这可能是有潜在危险的。这个解决方案是管弦乐队的可能解决方案的大管:它很有趣,它有效,但只有一个不好的音符或吱吱声使它一切都很糟糕。

然而,我最喜欢的潜在解决方案是:

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

这更安全,更清洁,性能与第一个解决方案(3,000,000条记录)差不多。

答案 1 :(得分:0)

我发现倒置索引可以帮助我:

1.使base_list成为反向索引:

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

2.当我需要计算['你好','世界']的计数次数。我只是找到它们的两个倒排索引并计算它们的常用文档。