복붙노트

[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. ==============================

    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.파이썬 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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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
    
  18. from https://stackoverflow.com/questions/24101524/finding-median-of-list-in-python by cc-by-sa and MIT license