1. 程式人生 > >時間殺手—for迴圈—如何找出兩個list中的相同元素

時間殺手—for迴圈—如何找出兩個list中的相同元素

import numpy
import datetime
a = numpy.random.randint( 5,1000,100000 )
b = numpy.random
startt1 = datetime.datetime.now()
l11 = sorted(list(set(a)))
l22 = sorted(list(set(b)))
l3 = []
x = 0
for i in l11:
    for j in range(x,len(l22)):
        if i == l22[j]:
            l3.append(i)
            x = j
            continue
endt1 = datetime.datetime.now()
print(l3)
print(endt1 - startt1)

randint( 5,1000,100000 )print(a)print(b)

當寫完這個程式碼的時候,,筆者跑出了10分鐘的成績,,,,,,,,,,,,,what f..................?????????????????????

為了解決這個問題,筆者決定從減去計算量的角度從新思考這個問題。


如果上圖是兩個列表,那麼是不是左界限的差值就可以不用計算了,,,遵從最小計算量的原則,筆者設定了兩個記錄左邊界限值的兩個類似於指標之類的東西,進行記錄,從左到右爬行。如果兩個值相等,那麼記錄改值,否則,繼續爬行,寫出來的程式碼像是這樣

import numpy
import datetime
a = numpy.random.randint( 5,100000,100000 )
b = numpy.random.randint( 5,100000,100000 )
print(a)
print(b)

startt1 = datetime.datetime.now()

def fun_x(x):
    x = x + 1
    return x


def fun_y(y):
    y = y + 1
    return y


def fund_loacation(L1, L2, L3, x=0, y=0):
    L1 = sorted(set(list(L1)))
    L2 = sorted(set(list(L2)))
    while x < len(L1) and y < len(L2):
        if L1[x] > L2[y]:
            y = fun_y(y)
        elif L1[x] < L2[y]:
            x = fun_x(x)
        elif L1[x] == L2[y]:
            L3.append(L1[x])
            x = fun_x(x)
            y = fun_y(y)
        else:
            pass
    return L3

print(fund_loacation(a, b, []))
endt1 = datetime.datetime.now()
print(endt1 - startt1)

上述程式碼的時間消耗近乎不計,,,然後我自信的在網路上百度了一下,看別人是如何寫的,然而發現了一個更神奇的方法,就像下面這樣:

startt1 = datetime.datetime.now()
set1 = set(a)
set2 = set(b)
print (set1 & set2)

endt1 = datetime.datetime.now()
print(endt1 - startt1)

測試了一下時間消耗,竟然比我寫的程式碼還要快,也許是因為set集與dict都是雜湊表查詢,所以鍵值比較更快的緣故吧,看來這是今日最佳啊,但是該程式碼有一個侷限,因為set的唯一性,因此只能找出不重複的,如果重複的話,會把重複值刪除掉,因此如果需要保留重複的話需要第二個程式碼。