簡體   English   中英

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

[英]Faster way to count number of matching 2nd elements between two list of tuples? - 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"

您可以使用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]),)

您可以在此處使用sets

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(min(len(se1), len(se2))

創建集合的時間復雜度: O(L) ,其中L是列表的長度

或者,您的izip()版本izip()僅比較相同索引上的項目)可以簡化為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM