[PYTHON] 파이썬에서 목록의 중간 값 찾기
PYTHON파이썬에서 목록의 중간 값 찾기
파이썬에서 목록의 중앙값을 어떻게 구합니까? 목록은 크기가 다를 수 있으며 번호는 특정 순서로 보장되지 않습니다.
목록에 짝수 개의 요소가 포함되어 있으면 함수는 중간 두 개의 평균을 반환해야합니다.
다음은 몇 가지 예입니다 (표시 목적으로 정렬 됨).
median([1]) == 1
median([1, 1]) == 1
median([1, 1, 2, 4]) == 1.5
median([0, 2, 5, 6, 8, 9, 9]) == 6
median([0, 0, 0, 0, 4, 4, 6, 8]) == 2
해결법
-
==============================
1.파이썬 3.4에는 statistics.median이 있습니다 :
파이썬 3.4에는 statistics.median이 있습니다 :
용법:
import statistics items = [1, 2, 3, 6, 8] statistics.median(items) #>>> 3
유형에도 꽤주의해야합니다.
statistics.median(map(float, items)) #>>> 3.0 from decimal import Decimal statistics.median(map(Decimal, items)) #>>> Decimal('3')
-
==============================
2.파이썬 2.x :
파이썬 2.x :
numpy.median ()을 사용하여 한 줄짜리 함수를 만듭니다.
>>> from numpy import median >>> median([1, -4, -1, -1, 1, -3]) -1.0
또는 함수를 작성하는 방법은 다음과 같습니다.
def median(lst): n = len(lst) if n < 1: return None if n % 2 == 1: return sorted(lst)[n//2] else: return sum(sorted(lst)[n//2-1:n//2+1])/2.0
>>> median([-5, -5, -3, -4, 0, -1]) -3.5
python-3.x의 경우 statistics.median을 사용하십시오.
>>> from statistics import median >>> median([5, 2, 3, 8, 9, -2]) 4.0
-
==============================
3.sorted () 함수는이 작업에 매우 유용합니다. 정렬 된 함수 사용 목록을 정렬하려면 중간 값을 반환하거나 (또는 평균 두 중간 목록에 짝수 개의 요소가 포함 된 경우 값).
sorted () 함수는이 작업에 매우 유용합니다. 정렬 된 함수 사용 목록을 정렬하려면 중간 값을 반환하거나 (또는 평균 두 중간 목록에 짝수 개의 요소가 포함 된 경우 값).
def median(lst): sortedLst = sorted(lst) lstLen = len(lst) index = (lstLen - 1) // 2 if (lstLen % 2): return sortedLst[index] else: return (sortedLst[index] + sortedLst[index + 1])/2.0
-
==============================
4.다음은 더 깨끗한 솔루션입니다.
다음은 더 깨끗한 솔루션입니다.
def median(lst): quotient, remainder = divmod(len(lst), 2) if remainder: return sorted(lst)[quotient] return sum(sorted(lst)[quotient - 1:quotient + 1]) / 2.
참고 : 의견이 의견에 제안을 포함하도록 변경되었습니다.
-
==============================
5.보다 빠른 평균 실행 시간이 필요한 경우 quickselect 알고리즘을 사용해 볼 수 있습니다. Quickselect는 나쁜 (나쁜) 날에 O (n²)를 끝낼 수 있지만 평균 (그리고 최고) 케이스 성능 O (n)을가집니다.
보다 빠른 평균 실행 시간이 필요한 경우 quickselect 알고리즘을 사용해 볼 수 있습니다. Quickselect는 나쁜 (나쁜) 날에 O (n²)를 끝낼 수 있지만 평균 (그리고 최고) 케이스 성능 O (n)을가집니다.
다음은 무작위로 선택된 피벗을 사용한 구현입니다.
import random def select_nth(n, items): pivot = random.choice(items) lesser = [item for item in items if item < pivot] if len(lesser) > n: return select_nth(n, lesser) n -= len(lesser) numequal = items.count(pivot) if numequal > n: return pivot n -= numequal greater = [item for item in items if item > pivot] return select_nth(n, greater)
당신은 trivially 중위를 찾을 수있는 방법으로 이것을 바꿀 수 있습니다 :
def median(items): if len(items) % 2: return select_nth(len(items)//2, items) else: left = select_nth((len(items)-1) // 2, items) right = select_nth((len(items)+1) // 2, items) return (left + right) / 2
이것은 거의 최적화되지 않았지만 최적화 된 버전조차도 Tim Sort (CPython의 기본 제공 정렬)보다 성능이 우수 할 수는 없습니다. 나는 전에 해봤고 잃어 버렸다.
-
==============================
6.list.sort를 사용하면 정렬 된 새 목록을 생성하지 않고 목록을 제 위치에 정렬 할 필요가 없습니다.
list.sort를 사용하면 정렬 된 새 목록을 생성하지 않고 목록을 제 위치에 정렬 할 필요가 없습니다.
또한 list를 변수 이름으로 사용해서는 안되며 python의 자체 목록을 숨길 수 있습니다.
def median(l): half = len(l) // 2 l.sort() if not len(l) % 2: return (l[half - 1] + l[half]) / 2.0 return l[half]
-
==============================
7.
def median(array): """Calculate median of the given list. """ # TODO: use statistics.median in Python 3 array = sorted(array) half, odd = divmod(len(array), 2) if odd: return array[half] return (array[half - 1] + array[half]) / 2.0
-
==============================
8.물론 빌드 기능을 사용할 수는 있지만 직접 만들려는 경우 이와 같은 작업을 수행 할 수 있습니다. 여기의 트릭은 ~ 연산자를 사용하여 양수를 음수로 바꿉니다. 예를 들어 ~ 2 -> -3이고 파이썬에서 for리스트를 사용하면 끝에서부터 항목이 계산됩니다. 따라서 중간 == 2이면 처음부터 세 번째 요소가 끝에서부터 세 번째 요소를 취합니다.
물론 빌드 기능을 사용할 수는 있지만 직접 만들려는 경우 이와 같은 작업을 수행 할 수 있습니다. 여기의 트릭은 ~ 연산자를 사용하여 양수를 음수로 바꿉니다. 예를 들어 ~ 2 -> -3이고 파이썬에서 for리스트를 사용하면 끝에서부터 항목이 계산됩니다. 따라서 중간 == 2이면 처음부터 세 번째 요소가 끝에서부터 세 번째 요소를 취합니다.
def median(data): data.sort() mid = len(data) // 2 return (data[mid] + data[~mid]) / 2
-
==============================
9.여기 내가 Codecademy에서이 연습을하는 동안 생각해 낸 점은 무엇입니까?
여기 내가 Codecademy에서이 연습을하는 동안 생각해 낸 점은 무엇입니까?
def median(data): new_list = sorted(data) if len(new_list)%2 > 0: return new_list[len(new_list)/2] elif len(new_list)%2 == 0: return (new_list[(len(new_list)/2)] + new_list[(len(new_list)/2)-1]) /2.0 print median([1,2,3,4,5,9])
-
==============================
10.중앙값 함수
중앙값 함수
def median(midlist): midlist.sort() lens = len(midlist) if lens % 2 != 0: midl = (lens / 2) res = midlist[midl] else: odd = (lens / 2) -1 ev = (lens / 2) res = float(midlist[odd] + midlist[ev]) / float(2) return res
-
==============================
11.내 솔루션을 파이썬에서 median of median 알고리즘 구현에 게시했습니다.이 알고리즘은 sort ()를 사용하는 것보다 약간 빠릅니다. 내 솔루션은 열당 5 개의 숫자를 사용하는 속도 ~ 10N보다 빠른 5N의 속도로 열당 15 개의 숫자를 사용합니다. 최적의 속도는 ~ 4N이지만 잘못된 것일 수 있습니다.
내 솔루션을 파이썬에서 median of median 알고리즘 구현에 게시했습니다.이 알고리즘은 sort ()를 사용하는 것보다 약간 빠릅니다. 내 솔루션은 열당 5 개의 숫자를 사용하는 속도 ~ 10N보다 빠른 5N의 속도로 열당 15 개의 숫자를 사용합니다. 최적의 속도는 ~ 4N이지만 잘못된 것일 수 있습니다.
그의 의견에 Tom의 요청에 따라 참조 용으로 여기에 코드를 추가했습니다. 스피드에서 중요한 부분은 5 개 대신 15 개 숫자를 사용한다고 생각합니다.
#!/bin/pypy # # TH @stackoverflow, 2016-01-20, linear time "median of medians" algorithm # import sys, random items_per_column = 15 def find_i_th_smallest( A, i ): t = len(A) if(t <= items_per_column): # if A is a small list with less than items_per_column items, then: # # 1. do sort on A # 2. find i-th smallest item of A # return sorted(A)[i] else: # 1. partition A into columns of k items each. k is odd, say 5. # 2. find the median of every column # 3. put all medians in a new list, say, B # B = [ find_i_th_smallest(k, (len(k) - 1)/2) for k in [A[j:(j + items_per_column)] for j in range(0,len(A),items_per_column)]] # 4. find M, the median of B # M = find_i_th_smallest(B, (len(B) - 1)/2) # 5. split A into 3 parts by M, { < M }, { == M }, and { > M } # 6. find which above set has A's i-th smallest, recursively. # P1 = [ j for j in A if j < M ] if(i < len(P1)): return find_i_th_smallest( P1, i) P3 = [ j for j in A if j > M ] L3 = len(P3) if(i < (t - L3)): return M return find_i_th_smallest( P3, i - (t - L3)) # How many numbers should be randomly generated for testing? # number_of_numbers = int(sys.argv[1]) # create a list of random positive integers # L = [ random.randint(0, number_of_numbers) for i in range(0, number_of_numbers) ] # Show the original list # # print L # This is for validation # # print sorted(L)[int((len(L) - 1)/2)] # This is the result of the "median of medians" function. # Its result should be the same as the above. # print find_i_th_smallest( L, (len(L) - 1) / 2)
-
==============================
12.나는 수의리스트를위한 중간 값 함수를 다음과 같이 정의했다.
나는 수의리스트를위한 중간 값 함수를 다음과 같이 정의했다.
def median(numbers): return (sorted(numbers)[int(round((len(numbers) - 1) / 2.0))] + sorted(numbers)[int(round((len(numbers) - 1) // 2.0))]) / 2.0
-
==============================
13.float 값 목록에 문제가있었습니다. 나는 python3 statistics.median에서 코드 스 니펫을 사용하여 끝내고 수입없이 float 값으로 완벽하게 작업하고 있습니다. 출처
float 값 목록에 문제가있었습니다. 나는 python3 statistics.median에서 코드 스 니펫을 사용하여 끝내고 수입없이 float 값으로 완벽하게 작업하고 있습니다. 출처
def calculateMedian(list): data = sorted(list) n = len(data) if n == 0: return None if n % 2 == 1: return data[n // 2] else: i = n // 2 return (data[i - 1] + data[i]) / 2
-
==============================
14.
def midme(list1): list1.sort() if len(list1)%2>0: x = list1[int((len(list1)/2))] else: x = ((list1[int((len(list1)/2))-1])+(list1[int(((len(list1)/2)))]))/2 return x midme([4,5,1,7,2])
-
==============================
15.npy로 numpy 가져 오기 데프 중앙값 (x) :
npy로 numpy 가져 오기 데프 중앙값 (x) :
if len(x)%2==0: x = sorted(x) num = round(len(x)/2) num2 = num-1 middlenum = (x[num]+x[num2])/2 else: x = sorted(x) listlength = len(x) num = round(listlength / 2) middlenum = x[num] return middlenum
-
==============================
16.
def median(array): if len(array) < 1: return(None) if len(array) % 2 == 0: median = (array[len(array)//2-1: len(array)//2+1]) return sum(median) / len(median) else: return(array[len(array)//2])
-
==============================
17.중간 값 함수를 사용하지 않고 중간 값을 찾는 지루한 방법은 다음과 같습니다.
중간 값 함수를 사용하지 않고 중간 값을 찾는 지루한 방법은 다음과 같습니다.
def median(*arg): order(arg) numArg = len(arg) half = int(numArg/2) if numArg/2 ==half: print((arg[half-1]+arg[half])/2) else: print(int(arg[half])) def order(tup): ordered = [tup[i] for i in range(len(tup))] test(ordered) while(test(ordered)): test(ordered) print(ordered) def test(ordered): whileloop = 0 for i in range(len(ordered)-1): print(i) if (ordered[i]>ordered[i+1]): print(str(ordered[i]) + ' is greater than ' + str(ordered[i+1])) original = ordered[i+1] ordered[i+1]=ordered[i] ordered[i]=original whileloop = 1 #run the loop again if you had to switch values return whileloop
from https://stackoverflow.com/questions/24101524/finding-median-of-list-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] dict를 적절하게 서브 클래스 화하고 __getitem__ & __setitem__을 재정의하는 방법 (0) | 2018.10.04 |
---|---|
[PYTHON] Selenium에서 Javascript 코드의 반환 값 얻기 (0) | 2018.10.04 |
[PYTHON] 파이썬 HTTP 연결에 인증 된 프록시를 지정하는 방법은 무엇입니까? (0) | 2018.10.04 |
[PYTHON] 파이썬으로 목록이나 배열로 텍스트 파일을 읽는 법 (0) | 2018.10.03 |
[PYTHON] 파이썬 또는 ipython 인터프리터를 입력 할 때 모듈을 자동으로 가져옵니다. (0) | 2018.10.03 |