在另一个全包列表中查找列表元素的存在数量

时间:2014-04-12 03:06:22

标签: python list

我想在没有for循环的情况下执行以下操作。

[[elem2.count(elem1) for elem1 in list1] for elem2 in list2]

这里,list2是一个列表列表,其中包含的元素类型与list1的元素类型相同。

示例:

list1 = ['word1', 'word2', 'word3', 'word4'] 
list2 = [['word1', 'word3', 'word1'], ['word2', 'word1', 'word2', 'word4', 'word4', 'word4']] 

结果应为:

[[2, 0, 1, 0], [1, 2, 0, 3]]

当列表很大时,嵌套的for循环需要不必要的长时间才能完成。因此,寻找更快的解决方案。

1 个答案:

答案 0 :(得分:2)

您当前的解决方案在大型列表上花费很长时间的原因是它的O(n ** 2)。但是你可以在O(n)中做到这一点,如果你只是在一个通道中建立一个计数器,然后使用它。

for循环不是敌人,它只是你算法复杂性的问题。

from collections import Counter

counters = [Counter(li) for li in list2]

[[cnt[x] for x in list1] for cnt in counters]
Out[9]: [[2, 0, 1, 0], [1, 2, 0, 3]]