2024-04-24 13:35:40 发布
网友
我有两个集合/数组/列表
a = [(12, 14, 0.3, 0.6, 0.8), (16, 18, 0.4, 0.5, 0.3), (19, 22, 0.4, 0.5, 0.3)] b = [(12, 14, 44, 12), (5, 4, 66, 12), (19, 22, 96, 45)]
我想找到c这是b中的项目列表,可以在a中找到,这样元组中只有前两个元素需要匹配(例如12 14)。所以在这种情况下,答案是
我使用了嵌套循环,但是太慢了。谢谢
如果先将a中所有唯一的两个项目元组存储在一个集合中,则可以在O(N)时间执行此操作:
a
O(N)
>>> keys = {x[:2] for x in a} >>> [x for x in b if x[:2] in keys] [(12, 14, 44, 12), (19, 22, 96, 45)]
请注意,如果只尝试匹配同一索引上的项,那么只需使用zip和列表理解:
zip
如果使用的是numpy,则可以使用numpy
numpy
In [49]: a = np.array([(12, 14, 0.3, 0.6, 0.8), (16, 18, 0.4, 0.5, 0.3), (19, 22, 0.4, 0.5, 0.3)]) In [50]: b = np.array([(12, 14, 44.0, 12.0), (5, 4, 66.0, 12.0), (19, 22, 96.0, 45.0)]) In [51]: print b[np.all(a[:,:2]==b[:,:2],1)] [[ 12. 14. 44. 12.] [ 19. 22. 96. 45.]]
它是如何工作的?
np.all接受布尔数组,并使用逻辑and沿可选第二个参数指定的轴(或使用所有元素)进行约简
np.all
In [53]: print np.all(a[:,:2]==b[:,:2]) False In [69]: print np.all(a[:,:2]==b[:,:2],1) [ True False True] In [70]: print np.all(a[:,:2]==b[:,:2],0) [False False] In [71]:
当然,在我们的例子中,正确使用的轴是1。在
1
(注:我必须承认在处理数组值的类型时有点草率)
你可以用列表理解来做这个
>>> a = [(12, 14, 0.3, 0.6, 0.8), (16, 18, 0.4, 0.5, 0.3), (19, 22, 0.4, 0.5, 0.3)] >>> b = [(12, 14, 44, 12), (5, 4, 66, 12), (19, 22, 96, 45)] >>> [item for item in b for checker in a if item[:2] == checker[:2]] [(12, 14, 44, 12), (19, 22, 96, 45)]
如果先将
a
中所有唯一的两个项目元组存储在一个集合中,则可以在O(N)
时间执行此操作:请注意,如果只尝试匹配同一索引上的项,那么只需使用
^{pr2}$zip
和列表理解:如果使用的是
numpy
,则可以使用numpy
它是如何工作的?
^{pr2}$np.all
接受布尔数组,并使用逻辑and沿可选第二个参数指定的轴(或使用所有元素)进行约简当然,在我们的例子中,正确使用的轴是
1
。在(注:我必须承认在处理数组值的类型时有点草率)
你可以用列表理解来做这个
相关问题 更多 >
编程相关推荐