【发布时间】:2016-10-04 05:45:52
【问题描述】:
我正在尝试遍历两个相同长度的列表,并且对于每个索引的一对条目,执行一个函数。该功能旨在对条目进行聚类 根据对函数返回值的一些要求X。
问题中的列表是:
e_list = [-0.619489,-0.465505, 0.124281, -0.498212, -0.51]
p_list = [-1.7836,-1.14238, 1.73884, 1.94904, 1.84]
并且该函数需要 4 个条目,l1 和 l2 的每个组合。 函数定义为
def deltaR(e1, p1, e2, p2):
de = e1 - e2
dp = p1 - p2
return de*de + dp*dp
到目前为止,我已经能够同时遍历列表:
for index, (eta, phi) in enumerate(zip(e_list, p_list)):
for index2, (eta2, phi2) in enumerate(zip(e_list, p_list)):
if index == index2: continue # to avoid same indices
if deltaR(eta, phi, eta2, phi2) < X:
print (index, index2) , deltaR(eta, phi, eta2, phi2)
这个循环对每个组合执行函数,除了那些相同的组合,即索引 0,0 或 1,1 等
代码的输出返回:
(0, 1) 0.659449892453
(1, 0) 0.659449892453
(2, 3) 0.657024790285
(2, 4) 0.642297230697
(3, 2) 0.657024790285
(3, 4) 0.109675332432
(4, 2) 0.642297230697
(4, 3) 0.109675332432
我正在尝试返回符合上述条件的所有索引的数量。换句话说,将输出重新排列为:
output = [No. matched entries]
即
output = [2, 3]
2 来自索引 0 和 1 匹配的事实
3 来自于索引 2、3 和 4 都匹配的事实
我想到的一种可能的方法是将所有使用的索引附加到一个列表中,以便我返回
output_list = [0, 1, 1, 0, 2, 3, 4, 3, 2, 4, 4, 2, 3]
然后,我使用 defaultdict 来计算出现次数:
for index in output_list:
hits[index] += 1
从 dict 我可以操纵它返回 [2,3] 但有没有更 Pythonic 的方式来实现这一点?
【问题讨论】:
-
在 this 示例中,条件对索引列表进行了分区,但我不明白为什么总是这样。基于距离的相似性度量通常不具有传递性(如果 x 接近 y 并且 y 接近 z,则不必是 x 接近 z 的情况)。但是,如果它不是可传递的,那么实际上并不清楚您的输出应该是什么,因为您似乎想要分区中单元格的大小。
-
在这种情况下,
deltaR(0,1)和deltaR(1,0)产生相同的值,因此应该考虑一次。因此,我不是在寻找反向对,而是满足上述要求的索引数量,即 2
标签: python