logo

파이썬 | 목록을 섞는 방법

Python에서 일련의 숫자를 섞는 것은 항상 유용한 유틸리티였으며 많은 회사 배치 인터뷰에서도 나타나는 질문이었습니다. 이를 달성하기 위한 두 가지 이상의 방법을 아는 것은 항상 장점이 ​​될 수 있습니다. 이를 달성할 수 있는 특정 방법에 대해 논의해 보겠습니다.

Python 무작위 목록 섞기

~ 안에 파이썬, 목록을 섞는 방법에는 여러 가지가 있습니다. 목록을 섞는 다양한 Python 방법은 다음과 같습니다.

  • 정렬() 사용
  • random.shuffle() 사용
  • Random.sample() 사용
  • 무작위 선택 방법 사용
  • Fisher-Yates 셔플 알고리즘 사용
  • itertools.permutations() 함수 사용
  • NumPy 사용

sorted()를 사용하여 목록을 무작위로 섞습니다.

목록의 정렬된 버전은 다음을 사용하여 생성될 수 있습니다. 정렬() 기능. 섞인 목록의 복사본에 요소를 사용하여 요소를 무작위로 효과적으로 섞습니다.

파이썬3




import> random> my_list>=> [>1>,>2>,>3>,>4>,>5>]> shuffled_list>=> sorted>(my_list, key>=>lambda> x: random.random())> print>(>'Original list:'>, my_list)> print>(>'Shuffled list:'>, shuffled_list)>

>

>

산출

Original list: [1, 2, 3, 4, 5] Shuffled list: [2, 3, 4, 5, 1]>

시간 복잡도: O(nlogn), 여기서 n은 목록의 길이입니다.
공간 복잡도: O(n), 여기서 n은 목록의 길이입니다.

Random.Shuffle()을 사용하여 목록 무작위화

무작위.셔플() 목록을 섞는 데 가장 권장되는 방법입니다. Python의 무작위 라이브러리에는 목록을 제자리에서 섞는 내장 함수가 제공됩니다. 단점은 이 프로세스에서 목록 순서가 손실된다는 것입니다. 시간을 절약하고 빠르게 작업하기를 원하는 개발자에게 유용합니다.

파이썬3




import> random> test_list>=> [>1>,>4>,>5>,>6>,>3>]> print>(>'The original list is : '> +> str>(test_list))> # using random.shuffle() to shuffle a list> random.shuffle(test_list)> print>(>'The shuffled list is : '> +> str>(test_list))>

자바 람다 예

>

>

산출

The original list is : [1, 4, 5, 6, 3] The shuffled list is : [5, 1, 3, 4, 6]>

시간 복잡도: O(n), 여기서 n은 목록의 길이입니다.
공간 복잡도: O(n), 여기서 n은 목록의 길이입니다.

목록을 무작위로 지정하세요. Random.Sample() 노래 부르기

무작위 샘플(), 이는 원래 목록의 순서를 어지럽히지 않고 새로운 섞인 목록을 생성하여 반환한다는 점에서 위에서 사용한 shuffle 방법보다 훨씬 유용한 기능입니다. 이는 원본 목록을 유지해야 하는 경우에 유용합니다.

파이썬3

자식 상태




import> random> test_list>=> [>1>,>4>,>5>,>6>,>3>]> print>(>'The original list is : '> +> str>(test_list))> # using random.sample()to shuffle a list> res>=> random.sample(test_list,>len>(test_list))> print>(>'The shuffled list is : '> +> str>(res))>

>

>

산출

The original list is : [1, 4, 5, 6, 3] The shuffled list is : [4, 3, 1, 6, 5]>

시간 복잡도: O(n), 여기서 n은 목록의 길이입니다.
공간 복잡도: O(n), 여기서 n은 목록의 길이입니다.

무작위 선택 방법을 사용하여 목록 무작위화

이 방법에서는 다음을 사용하여 목록을 무작위로 추출합니다. 무작위 선택 방법 . 인덱스를 무작위로 선택하고 해당 인덱스의 해당 요소를 목록에 추가합니다.

파이썬3




import> random> arr>=> [>1>,>2>,>3>,>4>,>5>,>6>]> print>(>'Original List: '>, arr)> n>=> len>(arr)> for> i>in> range>(n):> >j>=> random.randint(>0>, n>->1>)> >element>=> arr.pop(j)> >arr.append(element)> > print>(>'Shuffled List: '>, arr)>

>

>

산출

Original List: [1, 2, 3, 4, 5, 6] Shuffled List: [1, 5, 2, 6, 3, 4]>

시간 복잡도: O(n) 여기서 n은 목록의 길이입니다.
공간 복잡도: 오(1)

Fisher-Yates Shuffle 알고리즘을 사용하여 목록을 무작위로 섞기

유명한 알고리즘 중 하나입니다. 피셔-예이츠 셔플 알고리즘 , 주로 Python에서 일련의 숫자를 섞는 데 사용됩니다. 이 알고리즘은 더 높은 인덱스 값을 가져와 현재 값과 교환합니다. 이 프로세스는 목록이 끝날 때까지 루프에서 반복됩니다.

파이썬3




import> random> test_list>=> [>1>,>4>,>5>,>6>,>3>]> print>(>'The original list is : '> +> str>(test_list))> # using Fisher–Yates shuffle Algorithm to shuffle a list> for> i>in> range>(>len>(test_list)>->1>,>0>,>->1>):> ># Pick a random index from 0 to i> >j>=> random.randint(>0>, i>+> 1>)> ># Swap arr[i] with the element at random index> >test_list[i], test_list[j]>=> test_list[j], test_list[i]> print>(>'The shuffled list is : '> +> str>(test_list))>

>

>

산출

The original list is : [1, 4, 5, 6, 3]The shuffled list is : [3, 4, 5, 6, 1]>

시간 복잡도: O(n), 여기서 n은 목록의 길이입니다.
공간 복잡도: O(n), 여기서 n은 목록의 길이입니다.

Itertools.Permutations() 함수를 사용하여 목록 무작위화

이 방법은 다음을 사용하여 원래 목록의 가능한 모든 순열을 생성합니다. itertools.permutations() 기능을 선택한 다음 임의의 기능을 선택하세요.

파이썬3

dfs 알고리즘




import> random> import> itertools> lst>=> [>1>,>4>,>5>,>6>,>3>]> permutations>=> list>(itertools.permutations(lst))> shuffled_lst>=> random.choice(permutations)> print>(>'Shuffled list:'>, shuffled_lst)>

>

>

산출

Shuffled list: (6, 5, 4, 1, 3)>

시간 복잡도: O(n!) 여기서 n은 가능한 모든 순열의 생성으로 인한 목록의 길이입니다.
공간 복잡도: O(n!) 가능한 모든 순열이 생성되어 목록에 저장됩니다.

목록 무작위화 Numpy를 사용하여

우리는 사용하고 있습니다 넘파이() 목록의 항목을 섞습니다. numpy를 사용하여 목록을 무작위로 만들려면 목록을 NumPy 배열로 변환한 다음 축소 함수를 적용해야 합니다. 그러면 섞인 목록이 반환되고 섞인 목록이 인쇄됩니다.

파이썬3




SDLC 수명주기
import> numpy as np> from> functools>import> reduce> test_list>=> [>1>,>4>,>5>,>6>,>3>]> # Printing original list> print>(>'The original list is : '> +> str>(test_list))> # using reduce() and numpy to shuffle a list> res>=> reduce>(>lambda> acc, _: np.random.permutation(acc),> >range>(>len>(test_list)), np.array(test_list))> print>(>'The shuffled list is : '> +> str>(res.tolist()))>

>

>

산출

The original list is : [1, 4, 5, 6, 3] The shuffled list is : [3, 6, 1, 5, 4]>

시간 복잡도: Reduce() 함수의 시간 복잡도는 목록의 길이와 동일한 반복 횟수에 따라 달라집니다. np.random.permutation()의 시간 복잡도는 O(n)입니다. 여기서 n은 입력 배열의 길이입니다. 따라서 이 코드의 시간복잡도는 O(n^2)이다.
공간 복잡도: 이 코드의 공간 복잡도는 목록의 크기에 따라 다릅니다. 목록은 Reduce() 함수에서 사용하는 몇 가지 추가 변수와 함께 메모리에 저장됩니다. 따라서 공간복잡도는 O(n)이다.