0

我有一个这样的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更改为集合列表。

2.然后,把small_list也改成set:

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 条记录。

4

2 回答 2

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 条记录)。

于 2012-12-08T11:28:45.220 回答
0

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

1.使base_list变成倒排索引:

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

2.当我需要统计['Hello','World']的出现次数时。我只是找到它们的两个倒排索引并计算它们的共同文档。

于 2012-12-08T14:26:42.357 回答