Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 스타 표현식을 사용하여 압축을 푸는 방법은 무엇입니까?

<시간/>

소개

unpacking의 기본적인 제한 사항 중 하나는 unpacking하는 sequence의 길이를 미리 알고 있어야 한다는 것입니다.

그것을 하는 방법..

random_numbers = [0, 1, 5, 9, 17, 12, 7, 10, 3, 2]
random_numbers_descending = sorted(random_numbers, reverse=True)
print(f"Output \n*** {random_numbers_descending}")

출력

*** [17, 12, 10, 9, 7, 5, 3, 2, 1, 0]

이제 숫자에서 가장 큰 값과 두 번째로 큰 값을 찾으려면 "풀기할 값이 너무 많습니다"라는 예외가 발생합니다.

print(f"Output \n*** Getting the largest and second largest")
largest, second_largest = random_numbers_descending

출력

*** Getting the largest and second largest


---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
in
1 print(f"Output \n*** Getting the largest and second largest")
----> 2 largest, second_largest = random_numbers_descending

ValueError: too many values to unpack (expected 2)

파이썬은 종종 인덱싱과 슬라이싱에 의존합니다. 예를 들어 아래 항목 목록에서 가장 큰 것, 두 번째로 큰 것을 추출하고 싶을 때 우리가 할 수 있는 방법입니다.

largest = random_numbers_descending[0]
print(f"Output \n*** Getting the largest - {largest}")

출력

*** Getting the largest - 17


second_largest = random_numbers_descending[1]
print(f"Output \n*** Getting the second largest - {second_largest}")

출력

*** Getting the second largest - 12


rest_of_numbers = random_numbers_descending[2:]
print(f"Output \n*** Getting the rest of numbers - {rest_of_numbers}")

출력

*** Getting the rest of numbers - [10, 9, 7, 5, 3, 2, 1, 0]

이것이 작동하는 동안 모든 인덱싱 및 슬라이싱은 시각적으로 시끄럽습니다. 실제로 이러한 방식으로 시퀀스의 구성원을 다양한 하위 집합으로 나누는 것은 오류가 발생하기 쉽습니다.

이를 더 잘 수행하기 위해 Python은 별표 표시된 표현식을 통해 포괄적인 압축 풀기를 지원합니다.

이 별표 표시된 구문을 사용하면 압축 풀기 할당의 한 부분이 압축 풀기 패턴의 다른 부분과 일치하지 않는 모든 값을 받을 수 있습니다.

largest,second_largest, *rest_of_numbers = random_numbers_descending
print(f"Output \n largest: {largest} \n second_largest:{second_largest} \n rest_of_numbers:{rest_of_numbers}")

출력

largest: 17
second_largest:12
rest_of_numbers:[10, 9, 7, 5, 3, 2, 1, 0]

위의 코드는 어떻게 생겼습니까? 읽기 쉬운 한 줄로 출력을 얻을 수 있습니다. 별표 표시된 표현식은 어느 위치에나 나타날 수 있으므로 한 조각을 추출해야 할 때마다 포괄적인 압축 풀기의 이점을 얻을 수 있습니다.

largest: 17
rest_of_numbers:[12, 10, 9, 7, 5, 3, 2, 1]
smallest:0


*rest_of_numbers, second_smallest, smallest = random_numbers_descending
print(f"Output \n rest_of_numbers:{rest_of_numbers} \n second_smallest: {second_smallest} \n smallest:{smallest}")


rest_of_numbers:[17, 12, 10, 9, 7, 5, 3, 2]
second_smallest: 1
smallest:0

그러나 별표 표시된 표현식이 포함된 할당을 풀려면 최소한 하나의 필수 부분이 있어야 합니다. 그렇지 않으면 SyntaxError가 발생합니다. 포괄적인 표현은 단독으로 사용할 수 없습니다.

*rest_of_numbers = random_numbers_descending


File "", line 1
*rest_of_numbers = random_numbers_descending
^
SyntaxError: starred assignment target must be in a list or tuple

또한 단일 수준의 압축 풀기 패턴에서 여러 포괄 표현식을 사용할 수 없습니다. 이것은 고려해야 할 또 다른 중요한 참고 사항입니다.

*rest_of_numbers, *more_smallest, smallest = random_numbers_descending


File "", line 1
*rest_of_numbers, *more_smallest, smallest = random_numbers_descending
^
SyntaxError: two starred expressions in assignment


그러나 압축을 풀고 있는 다단계 구조의 다른 부분에 대한 포괄적인 한, 압축 풀기 할당 문에서 여러 별표 표시된 표현식을 사용할 수 있습니다.

player_grandslame_and_atptitles = {
'Federer': (20, 103),
'Nadal': (20,84),}

((player1, (grandslam1, *atptitles1)), (player2, (grandslam2, *atptitles2))) = player_grandslame_and_atptitles.items()

print(f'Output \nPlayer - {player1} Have acheived {grandslam1} grandslams and , {atptitles1} atp tour titles')
print(f'Player - {player2} Have acheived {grandslam2} grandslams and , {atptitles2} atp tour titles')


출력


Player - Federer Have acheived 20 grandslams and , [103] atp tour titles
Player - Nadal Have acheived 20 grandslams and , [84] atp tour titles

별표 표시된 표현식은 모든 경우에 목록 인스턴스가 됩니다. 압축을 풀고 있는 시퀀스에서 남은 항목이 없는 경우 포괄 부분은 빈 목록이 됩니다. 이것은 최소 N개의 요소가 있는 시퀀스를 미리 처리할 때 특히 유용합니다.

random_numbers = [0, 1]
first, second, *rest = random_numbers
print(f"Output \n{first, second, rest}")

출력

(0, 1, [])