2013-04-07 116 views
1

有更快的方法來計算兩個元組列表之間匹配的第二個元素的數量嗎?更快地計算兩個元組列表之間匹配的第二個元素的數量? - Python

我有元組本身和我基本上是通過他們循環一個元組在一個時間:

lstup1 = [('but', '00004722-r'), ('he', '000000NULL'), ('was', '02697725-v'), ('always', '00020280-r'), ('persuade', '00766418-v'), ('out', '02061487-a')] 
lstup2 = [(u'But', u'000000NULL'), (u'he', u'000000NULL'), (u'was', u'000000NULL'), (u'always', u'00019339-r'), (u'persuade', u'00766418-v'), (u'out', u'00232862-r')] 

for i,j in izip(lstup1,lstup2): 
    if i[1] == j[1]: 
    correct+=1 
    if j[1][-4:] == "NULL" 
     null+=1 
    count+=1 

print "Accuracy =", str(correct/count), "with", str(null), "NULL tags" 
+1

您可以使用如下的生成器表達式:'sum(i [1] == j [1] for zip,(zip)(lstup1,lstup2))' – 2013-04-07 20:08:33

回答

1

你可以在這裏使用setsO(min(len(se1), len(se2))

時間複雜度爲集創作:

In [5]: se1=set(x[1] for x in lstup1) 

In [6]: se2=set(x[1] for x in lstup2) 

In [7]: len(se1&se2) 
Out[7]: 2 

時間對路口複雜O(L),其中L是列表的長度

或者您izip()僅比較同一索引上的項目的版本可以被縮減爲:

sum(i[1]==j[1] for i,j in izip(lstup1,lstup2)) 
1

你可以使用numpy的:

>>> import numpy as np 
>>> lstup1 = [('but', '00004722-r'), ('he', '000000NULL'), ('was', '02697725-v'), ('always', '00020280-r'), ('persuade', '00766418-v'), ('out', '02061487-a')] 
>>> lstup2 = [(u'But', u'000000NULL'), (u'he', u'000000NULL'), (u'was', u'000000NULL'), (u'always', u'00019339-r'), (u'persuade', u'00766418-v'), (u'out', u'00232862-r')] 
>>> 
>>> npl1 = np.array(lstup1) 
>>> npl2 = np.array(lstup2) 
>>> npl1[:,1] == npl2[:,1] 
array([False, True, False, False, True, False], dtype=bool) 

如果你只是想知道的數等於對:

>>> np.sum(npl1[:,1] == npl2[:,1]) 
2 

如果您想知道索引位置:

>>> np.where(npl1[:,1] == npl2[:,1]) 
(array([1, 4]),) 
相關問題