我正在尋找一個有效的函式來查找串列中距離 k 處的相等元素。
輸入示例:
v=['a','c','d','e','a','c','e','e','e','d']
k=4
期望的輸出:
['a', 'c', 'e']
為什么:'a' 在位置 0 和 4 [4-0=k],'c' 在位置 1 和 5 [5-1=k],'e' 在位置 3 和 7 [7 -3=k]
如果可能的話,我正在尋找比使用 for 回圈逐個元素回圈更有效的方法。也就是說,我正在尋找比以下更好的東西:
def dist_k(k, v):
v_len = len(v)
out = []
for i in range(0,v_len,1):
if i k < v_len:
if v[i] == v[i k]:
out.append(v[i])
print(out)
uj5u.com熱心網友回復:
編輯
我找到了一個聰明的方法來更快地做到這一點,而不需要np.roll,并且不會將陣列視為回圈:
>>> import numpy as np
>>> v = ['a','c','d','e','a','c','e','e','e','d']
>>> v_np = np.array(v)
>>> k = 4
>>> v_init = v_np[:-k]
>>> v_init[v_init == v_np[k:]]
array(['a', 'c', 'e'])
這個想法是我存盤沒有最后一個元素的陣列的開頭k(那時我不需要,因為它們后面的元素少于k)。我存盤陣列,因為我需要它兩次。
>>> v_init = v_np[:-k]
>>> v_init
array(['a', 'c', 'd', 'e', 'a', 'c'])
然后我使用沒有第一個k元素的陣列的第二部分:
>>> v_np[k:]
array(['a', 'c', 'e', 'e', 'e', 'd'])
然后我可以比較兩個陣列:
>>> v_init == v_np[k:]
array([ True, True, False, True, False, False])
最后我可以得到與索引對應的元素v_init(不是來自,v因為陣列的長度不匹配):
>>> v_init[v_init == v_np[k:]]
array(['a', 'c', 'e'])
性能 由于它使用 numpy(使用 C 進行計算),這種方法對于大陣列來說會更快。但是,由于轉換為 numpy 陣列,小串列可能會更慢(甚至不確定,請嘗試解決您的問題):
def list_comprehension(v, k):
return [v[i] for i in range(len(v)-k) if v[i] == v[i k]]
def using_numpy(v, k):
v_np = np.array(v)
v_init = v[:-k]
return v_init[v_init == v[k:]]
>>> from timeit import timeit
>>> v = np.random.rand(100000).tolist() # I consider that the input is a simple list
>>> timeit(lambda: list_comprehension(v,k), number=1000)
7.875344538999343
>>> timeit(lambda: using_numpy(v,k), number=1000)
3.646597085000394
原始答案,用于圓形陣列
import numpy as np
v = np.array(['a','c','d','e','a','c','e','e','e','d'])
k = 4
v[v == np.roll(v,-k)]
基本上np.roll按k元素移動陣列,然后我只是將初始陣列與移動后的陣列進行比較,并保留它們相等的元素:
>>> np.roll(v, -k)
array(['a', 'c', 'e', 'e', 'e', 'd', 'a', 'c', 'd', 'e'])
>>> v == np.roll(v,-k)
array([ True, True, False, True, False, False, False, False, False,
False])
>>> v[v == np.roll(v,-k)]
array(['a', 'c', 'e'])
請注意,此方法將認為陣列是回圈的,即它認為陣列的第一個和最后一個值是相鄰的:
>>> v=np.array(['a','c','d','e','a','c','e','e','e','d', 'a'])
>>> v[v == np.roll(v,-k)]
array(['a', 'c', 'e', 'd'])
uj5u.com熱心網友回復:
您可以嘗試以下代碼:
v=['a','c','d','e','a','c','e','e','e','d']
k=4
result = [v[i] for i in range(len(v)-k) if v[i] == v[i k] ]
uj5u.com熱心網友回復:
我不知道這是否比其他建議更有效或更低,但這是另一種選擇:
v = ['a', 'c', 'd', 'e', 'a', 'c', 'e', 'e', 'e', 'd']
k = 4
print([e for e, f in zip(v, v[k:]) if e == f])
輸出:
['a', 'c', 'e']
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/468173.html
上一篇:如何在python中退出這個回圈
