programing

'sorted(list)'와 'list.sort()'의 차이점은 무엇입니까?

bestcode 2022. 9. 4. 15:21
반응형

'sorted(list)'와 'list.sort()'의 차이점은 무엇입니까?

list.sort()목록을 하며, 는 원래 목록을 대체합니다.sorted(list)원래 목록을 변경하지 않고 정렬된 목록 복사본을 반환합니다.

  • 어느 쪽이 다른 쪽보다 더 좋은 때는 언제입니까?
  • 어느 쪽이 더 효율적이죠?얼마만큼?
  • 는 상태로 수 ?list.sort()수되????

sorted()는 원래 목록은 영향을 받지 않고 정렬된 새 목록을 반환합니다. list.sort()목록을 정렬하여 목록 인덱스를 변환하고 반환한다.None( ( ( ( ( ( ( ( ( ( )

sorted()목록뿐만 아니라 반복할 수 있는 항목에서도 작동합니다.문자열, 튜플, 사전(키를 얻을 수 있음), 생성기 등 모든 요소가 포함된 목록을 정렬하여 반환합니다.

  • list.sort()는, 「」를 참조해 주세요.sorted()을 사용하다sorted()아직 목록이 아닌 반복 가능한 것을 분류하고 싶을 때.

  • , 「」는,list.sort()sorted()복사본을 만들 필요가 없기 때문입니다.다른 어떤 반복도, 당신은 선택의 여지가 없어요.

  • 아니요, 원래 위치를 검색할 수 없습니다.했을 때list.sort()이치노

sorted(list) »list.sort()

  • list.sort하여 반환한다.None
  • sorted모든 반복 가능 항목을 가져와서 정렬된 새 목록을 반환합니다.

sorted이 Python하지만 C "Python"에되어 있는 C: "" 내장 는 상당히 됩니다.

def sorted(iterable, key=None):
    new_list = list(iterable)    # make a new list
    new_list.sort(key=key)       # sort it
    return new_list              # return it

어떤 것을 사용해야 합니까?

  • list.sort원래의 정렬 순서를 보관 유지하고 싶지 않은 경우(따라서 리스트는 메모리에서 in-place로 재사용할 수 있습니다).또, 리스트의 유일한 소유자인 경우(리스트가 다른 코드로 공유되어 뮤트 되고 있는 경우는, 그 리스트가 사용되고 있는 버그가 발생할 가능성이 있습니다).
  • sorted원래 정렬 순서를 유지하거나 로컬 코드만 소유하는 새 목록을 작성하려는 경우.

list.sort() 뒤에 목록의 원래 위치를 가져올 수 있습니까?

아니요 - 사용자가 직접 복사하지 않은 경우 정렬이 내부에서 수행되므로 해당 정보는 손실됩니다.

"어느 쪽이 빠를까요?얼마나 더 빨라졌습니까?"

새 목록을 만들 때 발생하는 불이익을 설명하기 위해 시간 모듈을 사용합니다. 설정은 다음과 같습니다.

import timeit
setup = """
import random
lists = [list(range(10000)) for _ in range(1000)]  # list of lists
for l in lists:
    random.shuffle(l) # shuffle each list
shuffled_iter = iter(lists) # wrap as iterator so next() yields one at a time
"""

여기에 랜덤으로 정렬된 10000개의 정수 목록에 대한 결과가 나와 있습니다.여기서 알 수 있듯이 오래된 목록 작성 비용의 신화가 틀렸습니다.

파이썬 2.7

>>> timeit.repeat("next(shuffled_iter).sort()", setup=setup, number = 1000)
[3.75168503401801, 3.7473005310166627, 3.753129180986434]
>>> timeit.repeat("sorted(next(shuffled_iter))", setup=setup, number = 1000)
[3.702025591977872, 3.709248117986135, 3.71071034099441]

파이썬 3

>>> timeit.repeat("next(shuffled_iter).sort()", setup=setup, number = 1000)
[2.797430992126465, 2.796825885772705, 2.7744789123535156]
>>> timeit.repeat("sorted(next(shuffled_iter))", setup=setup, number = 1000)
[2.675589084625244, 2.8019039630889893, 2.849375009536743]

피드백을 받은 후, 저는 다른 특성을 가진 다른 테스트가 바람직하다고 판단했습니다.여기서 1,000번 반복할 때마다 길이가 100,000인 동일한 랜덤 순서 목록을 제공합니다.

import timeit
setup = """
import random
random.seed(0)
lst = list(range(100000))
random.shuffle(lst)
"""

나는 이 더 큰 종류의 차이는 Martijn이 말한 카피에서 나온 것이라고 해석하지만, 이것은 더 오래된 인기 있는 답변에서 언급된 점까지 지배하지 않는다, 여기서 시간 증가는 약 10%에 불과하다.

>>> timeit.repeat("lst[:].sort()", setup=setup, number = 10000)
[572.919036605, 573.1384446719999, 568.5923951]
>>> timeit.repeat("sorted(lst[:])", setup=setup, number = 10000)
[647.0584738299999, 653.4040515829997, 657.9457361929999]

, 의 내용을 소트로서 , 새로운 「」의 「신규」는 「신규」의 「신규」의 「신규」로 .sorted복사 버전은 1000길이로도 실행 시간이 2% 정도 더 걸립니다.

Poke는 자신의 코드도 실행했습니다. 코드는 다음과 같습니다.

setup = '''
import random
random.seed(12122353453462456)
lst = list(range({length}))
random.shuffle(lst)
lists = [lst[:] for _ in range({repeats})]
it = iter(lists)
'''
t1 = 'l = next(it); l.sort()'
t2 = 'l = next(it); sorted(l)'
length = 10 ** 7
repeats = 10 ** 2
print(length, repeats)
for t in t1, t2:
    print(t)
    print(timeit(t, setup=setup.format(length=length, repeats=repeats), number=repeats))

그는 1000000 길이 정렬에서도 비슷한 결과를 얻었지만, 시간은 약 5% 증가했을 뿐입니다.그 결과는 다음과 같습니다.

10000000 100
l = next(it); l.sort()
610.5015971539542
l = next(it); sorted(l)
646.7786222379655

결론:

" "로 sorted복사본을 만드는 것은 차이를 지배하지만 정렬 자체가 작업을 지배하고 이러한 차이를 중심으로 코드를 구성하는 것은 시기상조입니다.나는 사용할 것이다.sorted할 때, 는 '데이터 정렬 리스트'를 합니다.list.sort목록을 정렬해야 할 때, 그리고 그 결과에 따라 사용법이 결정됩니다.

가장 큰 차이점은 이다.sorted(some_list)는 새로운 것을 반환합니다.

a = [3, 2, 1]
print sorted(a) # new list
print a         # is not modified

★★★★★★★★★★★★★★★★★」some_list.sort()는 목록 정렬합니다.

a = [3, 2, 1]
print a.sort() # in place
print a         # it's modified

주의해 주세요.a.sort()print a.sort()합니다.를 인쇄합니다.None.


list.sort() 뒤에 원래 위치를 가져올 수 있습니까?

아니요, 원래 목록을 수정하기 때문입니다.

다음으로 동작의 차이를 확인할 수 있는 간단한 예를 몇 가지 나타냅니다.

다음 번호 목록을 참조하십시오.

nums = [1, 9, -3, 4, 8, 5, 7, 14]

" " 를 할 sorted 리스트에서는, 「 」의sorted리스트의 카피가 작성됩니다.(즉, 원래 리스트는 변경되지 않습니다.)

어디 보자.

sorted(nums)

돌아온다

[-3, 1, 4, 5, 7, 8, 9, 14]

을 보다nums 하다

nums

원래의 리스트가 표시됩니다(변경되지 않고 정렬되지 않음). sorted하지 않았습니다.

[1, 2, -3, 4, 8, 5, 7, 14]

같은 똑같이 가져가다하는 것은nums목록과 목록 및 적용을 적용하는sort그것에 기능, 실제 목록을 바꿀 것이다.기능을 사용하면 실제목록이 변경됩니다.

어디 보자.

우리 델부터에 출발하는 것nums목록 확인한 내용은 아직도 여전합니다동일한지 확인합니다 내용이목록이 표시되어.

nums

[-3, 1, 4, 5, 7, 8, 9, 14]

nums.sort()

이것으로 원래의 번호 리스트가 변경되어 번호를 보면, 원래의 리스트가 변경되어 있습니다.

nums
[-3, 1, 2, 4, 5, 7, 8, 14]

주의: sort()와 sorted()의 가장 간단한 차이점은 sort()는 값을 반환하지 않는 반면 sort()는 반복 가능한 목록을 반환한다는 것입니다.

sort()는 값을 반환하지 않습니다.

sort() 메서드는 지정된 목록의 요소를 특정 순서(Ascending 또는 Descending)로 정렬할 뿐 값을 반환하지 않습니다.

sort() 메서드의 구문은 다음과 같습니다.

list.sort(key=..., reverse=...)

또는 Python의 내장 함수 sorted()를 같은 목적으로 사용할 수도 있습니다.정렬된 함수 반환 정렬된 목록

 list=sorted(list, key=..., reverse=...)

.sort() 함수는 새 목록의 값을 목록 변수에 직접 저장하므로 세 번째 질문에 대한 답변은 "아니오"입니다.또한 sorted(list)를 사용하여 이 작업을 수행할 경우 목록 변수에 저장되지 않으므로 사용할 수 있습니다.또한 .sort() 메서드가 함수로 동작하거나 인수를 받는 경우도 있습니다.

sorted(목록) 값은 변수에 명시적으로 저장해야 합니다.

또한 짧은 데이터 처리 속도에는 차이가 없습니다.단, 긴 목록의 경우 빠른 작업에는 .sort() 메서드를 직접 사용해야 합니다.단, 되돌릴 수 없는 액션이 발생합니다.

list.sort()에서는 목록 변수를 변경하지만 sorted(list)에서는 변수를 변경하지 않습니다.

정렬 사용:

list = [4, 5, 20, 1, 3, 2]
list.sort()
print(list)
print(type(list))
print(type(list.sort())

반환할 내용:

[1, 2, 3, 4, 5, 20]
<class 'NoneType'>

그러나 sorted()를 사용하는 경우:

list = [4, 5, 20, 1, 3, 2]
print(sorted(list))
print(list)
print(type(sorted(list)))

반환할 내용:

[1, 2, 3, 4, 5, 20]
[4, 5, 20, 1, 3, 2]
<class 'list'>

언급URL : https://stackoverflow.com/questions/22442378/what-is-the-difference-between-sortedlist-vs-list-sort

반응형