我正在尝试找到一种可靠的方法来检查list2
中是否存在i for i in list1
(所有相同长度)中的位置列表元素?
这看起来与我需要的相反:
How to check if one of the following items is in a list?
>>> list1 = [('1', '2', '3'), ('a', 'b', 'c'), ('4', '5', '6')]
>>> list2 = [('a', 'b', 'c'), ('m', 'n', 'b'), ('p', 'q', '6')]
>>> print(any(z in [i[2] for i in list1] for z in [z for x,y,z in list2]))
True
理想情况下,我需要('m','n,'b')
list2
,因为在'b'
的任何第3个元素中找不到list1
,所以如何将其隔离出来?
而不是'any'我正在寻找这种伪代码:
print x,y,z from list2 if 'z' is not found in any 3rd position element in all the lists present in "list1"
答案 0 :(得分:1)
从第一个列表中创建一组所有第三个元素,然后根据集合测试第二个列表中的元组:
library(rbenchmark)
benchmark(prune_cutree_to_dendlist(dend, 5),
prune_cutree_to_dendlist2(dend, 5), replications=5)
test replications elapsed relative user.self
1 prune_cutree_to_dendlist(dend, 5) 5 0.02 1 0.020
2 prune_cutree_to_dendlist2(dend, 5) 5 60.82 3041 60.643
首先将值再次存储到测试中的效率要高得多,而不是每次都循环遍历所有值。
演示:
third_positions = {t[2] for t in list1}
[t for t in list2 if t[2] not in third_positions]
如果你必须使用>>> list1 = [('1', '2', '3'), ('a', 'b', 'c'), ('4', '5', '6')]
>>> list2 = [('a', 'b', 'c'), ('m', 'n', 'b'), ('p', 'q', '6')]
>>> third_positions = {t[2] for t in list1}
>>> print([t for t in list2 if t[2] not in third_positions])
[('m', 'n', 'b')]
,那么这也是可能的,但是对any()
中的每个元组都会导致list1
的循环,所以O( NM)代替O(N):
list2