Python: 목록 요소 간의 차이점 찾기
숫자의 리스트가 주어졌을 때, 각각의 ()의 차이를 어떻게 찾을 수 있을까요?i
)- 제1요소 및 그 (i+1
)-th?
를 사용하는 것이 좋습니까?lambda
표현이나 목록 이해?
예를 들어 다음과 같습니다.
지정된 리스트t=[1,3,6,...]
, 목표는 목록을 찾는 것입니다.v=[2,3,...]
왜냐면3-1=2
,6-3=3
,기타.
>>> t
[1, 3, 6]
>>> [j-i for i, j in zip(t[:-1], t[1:])] # or use itertools.izip in py2k
[2, 3]
다른 답은 맞지만 수치 작업을 하고 있다면 numpy를 고려해 보는 것이 좋습니다.numpy를 사용하면 답은 다음과 같습니다.
v = numpy.diff(t)
사용하기 싫으면numpy
도 아니다zip
, 다음의 솔루션을 사용할 수 있습니다.
>>> t = [1, 3, 6]
>>> v = [t[i+1]-t[i] for i in range(len(t)-1)]
>>> v
[2, 3]
시작점Python 3.10
새로운 기능으로 요소의 쌍을 슬라이드하여 롤링 페어에 매핑할 수 있습니다.
from itertools import pairwise
[y-x for (x, y) in pairwise([1, 3, 6, 7])]
# [2, 3, 1]
중간 결과는 다음과 같습니다.
pairwise([1, 3, 6, 7])
# [(1, 3), (3, 6), (6, 7)]
및 을 사용할 수 있습니다.zip
효율적인 결과 구축:
from itertools import tee
# python2 only:
#from itertools import izip as zip
def differences(seq):
iterable, copied = tee(seq)
next(copied)
for x, y in zip(iterable, copied):
yield y - x
또는 대신 다음을 사용합니다.
from itertools import islice
def differences(seq):
nexts = islice(seq, 1, None)
for x, y in zip(seq, nexts):
yield y - x
또, 의 사용을 회피할 수도 있습니다.itertools
모듈:
def differences(seq):
iterable = iter(seq)
prev = next(iterable)
for element in iterable:
yield element - prev
prev = element
이러한 솔루션은 모든 결과를 저장하고 무한 반복 가능 여부를 지원할 필요가 없는 경우 일정한 공간에서 작동합니다.
솔루션의 몇 가지 마이크로 벤치마크를 다음에 제시하겠습니다.
In [12]: L = range(10**6)
In [13]: from collections import deque
In [15]: %timeit deque(differences_tee(L), maxlen=0)
10 loops, best of 3: 122 ms per loop
In [16]: %timeit deque(differences_islice(L), maxlen=0)
10 loops, best of 3: 127 ms per loop
In [17]: %timeit deque(differences_no_it(L), maxlen=0)
10 loops, best of 3: 89.9 ms per loop
기타 제안 솔루션:
In [18]: %timeit [x[1] - x[0] for x in zip(L[1:], L)]
10 loops, best of 3: 163 ms per loop
In [19]: %timeit [L[i+1]-L[i] for i in range(len(L)-1)]
1 loops, best of 3: 395 ms per loop
In [20]: import numpy as np
In [21]: %timeit np.diff(L)
1 loops, best of 3: 479 ms per loop
In [35]: %%timeit
...: res = []
...: for i in range(len(L) - 1):
...: res.append(L[i+1] - L[i])
...:
1 loops, best of 3: 234 ms per loop
주의:
zip(L[1:], L)
와 동등하다zip(L[1:], L[:-1])
부터zip
는 이미 최단 입력으로 종료되어 있습니다만, 그 때문에, 의 카피 전체가 회피됩니다.L
.- 모든 인덱스 액세스는 python의 메서드 호출이기 때문에 인덱스로 단일 요소에 액세스하는 것은 매우 느립니다.
numpy.diff
첫 번째 변환이 필요하기 때문에 속도가 느립니다.list
에 대해서ndarray
물론, 만약 당신이 이 모든 것을ndarray
훨씬 더 빠를 것입니다.In [22]: arr = np.array(L) In [23]: %timeit np.diff(arr) 100 loops, best of 3: 3.02 ms per loop
다음을 사용하는 것이 좋습니다.
v = np.diff(t)
이것은 간단하고 읽기 쉽다.
하지만 네가 원한다면v
길이가 같다t
그리고나서
v = np.diff([t[0]] + t) # for python 3.x
또는
v = np.diff(t + [t[-1]])
참고: 이것은 목록에 대해서만 작동합니다.
numpy 어레이의 경우
v = np.diff(np.append(t[0], t))
사용방법:=
Python 3.8+에서 사용할 수 있는 바다코끼리 연산자:
>>> t = [1, 3, 6]
>>> prev = t[0]; [-prev + (prev := x) for x in t[1:]]
[2, 3]
기능적 접근법:
>>> import operator
>>> a = [1,3,5,7,11,13,17,21]
>>> map(operator.sub, a[1:], a[:-1])
[2, 2, 2, 4, 2, 4, 4]
제너레이터 사용:
>>> import operator, itertools
>>> g1,g2 = itertools.tee((x*x for x in xrange(5)),2)
>>> list(itertools.imap(operator.sub, itertools.islice(g1,1,None), g2))
[1, 3, 5, 7]
인덱스 사용:
>>> [a[i+1]-a[i] for i in xrange(len(a)-1)]
[2, 2, 2, 4, 2, 4, 4]
좋아, 내가 적절한 해결책을 찾은 것 같아
v = [x[0]-x[1] for x in zip(t[1:],t[:-1])]
어쨌든 numpy diff 명령어는 다음과 같은 기능을 하고 있다고 생각합니다만, 완전성을 위해서 서브 벡터를 간단하게 구별할 수 있습니다.
from numpy import array as a
a(x[1:])-a(x[:-1])
또한 질문의 일반화에 다음 솔루션을 추가하고자 합니다.
정기적인 경계가 있는 솔루션
때로는 수치 통합으로 주기적인 경계 조건을 사용하여 목록을 비교해야 할 수 있습니다(따라서 첫 번째 요소는 마지막까지의 차이를 계산합니다).이 경우 numpy.roll 함수가 도움이 됩니다.
v-np.roll(v,1)
추가되지 않은 솔루션
(완전성을 위해) 또 다른 수치형 솔루션은
numpy.ediff1d(v)
이것은 numpy.diff로 동작하지만 벡터에서만 동작합니다(입력 배열을 평탄화합니다).결과 벡터에 숫자를 추가하거나 추가할 수 있습니다.이 기능은 기상 변수(예: 비, 잠열 등)의 경우 플럭스인 누적 필드를 처리할 때 유용합니다. 첫 번째 입력은 변경되지 않고 입력 변수와 동일한 길이의 결과 목록을 원할 수 있습니다.
그리고 너는 글을 쓸 것이다.
np.ediff1d(v,to_begin=v[0])
물론 np.diff 명령어를 사용하여 이 작업을 수행할 수도 있습니다.단, 이 경우 prepend 키워드를 사용하여 시리즈에 제로를 부가해야 합니다.
np.diff(v,prepend=0.0)
위의 모든 솔루션은 입력과 같은 길이의 벡터를 반환합니다.
또한 다음을 사용하여 차이를 쉽게 읽을 수 있는 전환 매트릭스로 변환할 수 있습니다.
v = t.reshape((c,r)).T - t.T
서 ★★★★★c
= 목록 내 항목 수 및r
목록은 기본적으로 벡터 또는 1D 배열이므로 = 1입니다.
나의 방법이다.
>>>v = [1,2,3,4,5]
>>>[v[i] - v[i-1] for i, value in enumerate(v[1:], 1)]
[1, 1, 1, 1]
언급URL : https://stackoverflow.com/questions/2400840/python-finding-differences-between-elements-of-a-list
'source' 카테고리의 다른 글
Pymongo를 사용하여 Mongodb의 연결 시간 제한을 설정하는 방법은 무엇입니까? (0) | 2023.07.18 |
---|---|
네이티브 쿼리를 사용하여 스프링 데이터에서 사용자 지정 개체 반환 (0) | 2023.07.18 |
.net core 2.0에서 x-powered-by 헤더를 삭제하는 방법 (0) | 2023.04.24 |
iPad 멀티태스킹 지원에는 다음과 같은 방향성이 필요합니다. (0) | 2023.04.24 |
Azure WebJobs ServiceBus가 예외 반환: 인가 컨텍스트에서 2개의 DNS 클레임을 발견함 (0) | 2023.04.24 |