我有一个像这样的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条记录。
答案 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.当我需要计算['你好','世界']的计数次数。我只是找到它们的两个倒排索引并计算它们的常用文档。