2014-07-22 71 views
3

我不是在尋找一個解決方案(我有兩個;)),而是通過洞察來比較每個解決方案在考慮python內部方面的長處和短處。謝謝 !更好的解決方案來獲得列表元素之間的差異

對於同事,我們希望提取兩個連續列表元素之間的差異,適用於所有元素。因此,對於列表:

[1,2,4] 

預期輸出是:

[1,2] 

(因爲2-1 = 1,和4-2 = 2)。

我們有兩種解決方案,我不確定他們是如何比較的。第一個非常類似C,它將列表視爲一個表,並將兩個連續列表元素之間的差異減去。

res = [] 
for i in range(0, len(a)-1): 
    res.append(a[i+1] - a[i]) 

第二個是(一個列表「L」),我想,更Python:

[j - i for i,j in zip(l[:-1], l[1:])] 

雖然,是不是效率遠不如建列表的兩個副本,以然後提取差異? Python如何在內部處理這個問題?

感謝您的見解!

+0

您應該發佈這兩種解決方案,他們會比較容易比較。 – TheSoundDefense

+0

如果您不想構建列表副本,請使用'itertools.izip'和'itertools.islice'。 – jonrsharpe

+0

@TheSoundDefense:的確,謝謝。我編輯了我的帖子。 – Jokyjo

回答

3

帶發電機:

def diff_elements(lst): 
    """ 
    >>> list(diff_elements([])) 
    [] 
    >>> list(diff_elements([1])) 
    [] 
    >>> list(diff_elements([1, 2, 4, 7])) 
    [1, 2, 3] 
    """ 
    as_iter = iter(lst) 
    last = next(as_iter) 
    for value in as_iter: 
     yield value - last 
     last = value 

這具有的良好特性:

  1. 具有可讀性,並
  2. 工作無限大的數據集。
0

如果我明白你的問題,我建議你使用類似的東西:

diffList = lambda l: [(l[i] - l[i-1]) for i in range(1, len(l))] 
answer = diffList([ 1,2,4]) 

此功能將給予您在輸入列表中的所有連續元素之間的差異列表。

這個與你的第一種方法類似(但仍有點pythonic)什麼是比第二種方法更有效。

0

由於沒有lambda表達式:

[l[i+1] - l[i] for i in range(len(l) - 1)] 

如:

>>> l = [1, 4, 8, 15, 16] 
>>> [l[i+1] - l[i] for i in range(len(l) - 1)] 
[3, 4, 7, 1] 

更快一點,因爲你可以看到(編輯:添加最投票解決方案https://stackoverflow.com/a/2400875/1171280):

>>> import timeit 
>>> 
>>> s = """\ 
...  l = [1, 4, 7, 15, 16] 
...  [l[i+1] - l[i] for i in range(len(l) - 1)] 
... """ 


>>> r = """\ 
...  l = [1, 4, 7, 15, 16] 
...  [j - i for i,j in zip(l[:-1], l[1:])] 
... """ 

>>> t = """\ 
...  l = [1, 4, 7, 15, 16] 
...  [j-i for i, j in itertools.izip(l[:-1], l[1:])] 
... """ 

>>> timeit.timeit(stmt=s, number=100000) 
0.09615588188171387 
>>> timeit.timeit(stmt=s, number=100000) 
0.09774398803710938 
>>> timeit.timeit(stmt=s, number=100000) 
0.09683513641357422 
#------------- 
>>> timeit.timeit(stmt=r, number=100000) 
0.14137601852416992 
>>> timeit.timeit(stmt=r, number=100000) 
0.12511301040649414 
>>> timeit.timeit(stmt=r, number=100000) 
0.12285017967224121 
#------------- 
>>> timeit.timeit(stmt=t, number=100000) 
0.11506795883178711 
>>> timeit.timeit(stmt=t, number=100000) 
0.11677718162536621 
>>> timeit.timeit(stmt=t, number=100000) 
0.11829996109008789 
相關問題