比较数组的最快方法

时间:2016-11-17 23:46:03

标签: python arrays list shingles

question扩展,我需要尽可能快的解决方案:

鉴于以下内容:

m=['abc','bcd','cde','def']
r=[['abc','def'],['bcd','cde'],['abc','def','bcd']]

我想编辑这些对象(或生成新对象),这样对于列表m中的每个元素,如果它在r的所有列表中存在的次数少于2次,则该元素将从m中删除,也可以从任何地方删除它发生在r。

所以上面的结果看起来像这样:

['abc','bcd','def']

...因为'cde'只在r。

中找到一次

更好的是:

[2, 2, 1, 2]

...或r中列表中m个元素的频率计数。 然后,根据数字,如果值符合某个标准,我可以根据输出的索引编辑r中的列表。

例如,如果i< 2或> 100,则删除r中每个列表的索引i。

有一种循环方式可以做到这一点,但它比1月的糖蜜慢:

我的出发点是:

[[1 if mx in rx else 0 for mx in m] for rx in map(set, r)]

会产生这个:

[[1, 0, 0, 1], [0, 1, 1, 0], [1, 1, 0, 1]]

提前致谢!

1 个答案:

答案 0 :(得分:2)

以下是获取计数的一行:

print [sum([1 for _r in r if _m in _r]) for _m in m]

它给出了相同的结果,你写了:

[2, 2, 1, 2]