일반적인 작업을 단순화하는 16가지 유용한 Python 원라이너

세련되고 파이썬다운 코드를 작성하고 싶으신가요? 여기, 간단한 작업들을 수행하는 데 매우 유용한 파이썬 원라이너(한 줄 코드) 목록이 있습니다.

파이썬 초보 프로그래머라면 리스트나 문자열 같은 기본 데이터 구조를 익히는 데 시간을 많이 할애할 것입니다. 이러한 데이터 구조에 대한 몇 가지 일반적인 작업들은 간결한 한 줄의 코드 스니펫으로 처리할 수 있습니다.

프로그래머는 코드의 간결성보다는 가독성과 유지보수성을 우선시해야 합니다. 하지만 파이썬에서는 좋은 코딩 습관을 따르는 한 줄짜리 코드를 쉽게 작성할 수 있습니다.

이 글에서는 파이썬에서 간단한 리스트 및 문자열 처리 작업을 위한 한 줄 코드에 초점을 맞출 것입니다.

이제 시작해 볼까요!

숫자 리스트 생성

숫자 리스트를 만드는 가장 쉬운 방법은 range() 함수를 사용하는 것입니다. range() 함수는 리스트로 변환할 수 있는 범위 객체를 반환합니다. range(num)을 사용하면 0, 1, 2, …, num-1의 시퀀스가 생성됩니다.

>>> nums = list(range(10))
>>> nums
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

range() 함수 사용에 대해 더 자세히 알아보기

range() 함수는 선택적인 step 값과 함께 사용할 수도 있습니다. range(시작, 끝, 단계)는 시작, 시작 + 단계, 시작 + 2*단계 등의 시퀀스를 생성합니다. 마지막 값은 (시작 + k*단계) < 끝 이고 (시작 + (k+1)*단계) > 끝을 만족하는 시작 + k*단계가 됩니다.

리스트에서 최대값과 최소값 찾기

내장된 maxmin 함수를 사용하여 리스트에서 각각 최대 및 최소 요소를 쉽게 구할 수 있습니다.

>>> min_elt, max_elt = min(nums), max(nums)
>>> min_elt
0
>>> max_elt
9

📑 다중 할당에 대한 참고

단일 할당문에서 min_eltmax_elt 모두에 값이 할당된 것을 확인하세요. 파이썬은 이러한 다중 할당을 지원합니다. 이는 이터러블을 언패킹하고 여러 변수에 동시에 값을 할당할 때 유용하게 사용될 수 있습니다.

리스트에서 중복 제거

또 다른 일반적인 작업은 파이썬 리스트에서 중복 항목을 제거하는 것입니다. 이는 고유한 값으로만 작업해야 할 때 필요합니다. 가장 간단한 방법은 리스트를 세트(set)로 변환하는 것입니다.

세트는 요소가 모두 고유하고 해시 가능한 내장 데이터 구조입니다.

>>> nums1 = [2,4,7,9,7,10]

nums1에서 요소 7이 두 번 나타납니다. 세트로 변환하면 중복(여기서는 7)이 제거되어 고유한 값의 리스트가 남습니다.

여전히 리스트로 작업해야 하므로, 세트를 다시 리스트로 변환합니다. 이 작업은 다음 코드 한 줄로 수행할 수 있습니다.

>>> nums1 = list(set(nums1))
>>> nums1
[2, 4, 7, 9, 10]

📒 파이썬 리스트에서 중복을 제거하는 다른 기술에 대해 자세히 알아보려면 이 가이드를 확인하세요.

리스트에서 발생 횟수 세기

어떤 요소가 리스트에서 몇 번 나타나는지 세려면, 내장된 count() 메서드를 사용할 수 있습니다. list.count(elt)는 리스트에서 elt가 나타나는 횟수를 반환합니다.

>>> nums
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

여기서 7은 nums 리스트에 한 번 나타나므로 count() 메서드는 1을 반환합니다.

>>> nums.count(7)
1

리스트의 모든 요소가 조건을 만족하는지 확인

리스트의 모든 요소가 특정 조건을 만족하는지 확인하려면 파이썬 내장 함수인 all()을 사용할 수 있습니다.

all() 함수는 이터러블을 인수로 받아서 이터러블의 모든 요소가 True로 평가되면 True를 반환합니다. (혹은 참으로 간주될 수 있는 값)

여기서는 nums2 리스트의 모든 요소가 홀수인지 확인해 보고 싶습니다.

>>> nums2 = [3,4,7,11,21,67,12]

리스트 컴프리헨션을 사용하여 불리언 리스트를 만들고 해당 리스트를 all() 함수의 인수로 전달할 수 있습니다.

여기서 짝수인 요소 4와 12에 대해서는 num%2!=0이 False가 됩니다. 따라서 리스트 컴프리헨션으로 구성된 불리언 리스트에는 False가 포함되고 (그리고 all(list)는 False를 반환합니다.)

>>> all([num%2!=0 for num in nums2])
False

💡 all([])(비어 있는 이터러블에 대한 all())은 True를 반환합니다.

리스트의 일부 요소가 조건을 만족하는지 확인

리스트의 일부 요소가 조건을 만족하는지 확인하려면 any() 함수를 사용할 수 있습니다. any(some-list)는 하나 이상의 요소가 True로 평가되면 True를 반환합니다.

>>> nums2 = [3,4,7,11,21,67,12]

이전 예시와 마찬가지로, 리스트 컴프리헨션을 사용하여 불리언 리스트를 얻습니다. nums 리스트에는 짝수가 포함되어 있으므로 any() 함수는 True를 반환합니다.

>>> any([num%2 for num in nums2])
True

문자열 뒤집기

파이썬에서 문자열은 변경할 수 없으므로 문자열을 뒤집고 싶다면 문자열의 뒤집힌 복사본만 얻을 수 있습니다. 문자열 슬라이싱과 내장 함수를 사용하는 두 가지 일반적인 방법이 있으며, 둘 다 파이썬 원라이너로 작성할 수 있습니다.

문자열 슬라이싱 사용

단계(step)에 음수 값을 사용하는 문자열 슬라이싱은 문자열을 끝에서 시작하여 조각을 반환합니다. 구문은 문자열[시작:끝:단계] 입니다. 따라서 단계를 -1로 설정하고 시작 및 끝 인덱스를 무시하면 어떤 결과가 나올까요?

모든 문자를 포함하여 문자열의 끝에서 시작하는 문자열의 복사본이 반환됩니다.

>>> str1[::-1]
'olleh'

reversed() 함수 사용

내장된 reversed() 함수는 시퀀스에 대한 역 이터레이터를 반환합니다.

>>> reversed(str1)
<reversed object at 0x008BAF70>
>>> for char in str1:
...     print(char)
...
h
e
l
l
o

다음과 같이 join() 메서드와 함께 사용할 수 있습니다.

>>> ''.join(reversed(str1))
'olleh'

문자열을 문자 리스트로 변환

문자열을 문자 리스트로 분할하고 싶다고 가정해 보겠습니다. 리스트 컴프리헨션을 사용하여 이렇게 할 수 있습니다.

>>> str1 = 'hello'

리스트 컴프리헨션은 파이썬에서 가장 강력한 원라이너 중 하나입니다.

📒 파이썬의 리스트 컴프리헨션에 대해 자세히 알아보세요.

문자열을 반복하고 각 문자를 수집합니다.

>>> chars = [char for char in str1]
>>> chars
['h', 'e', 'l', 'l', 'o']

공백이 나타날 때마다 더 긴 문자열을 문자열 리스트로 분할하려면 split() 메서드를 사용할 수 있습니다.

>>> str2 = 'hello world'
>>> str2.split()
['hello', 'world']

이미 리스트 컴프리헨션을 사용하여 문자열을 문자 리스트로 분할하는 방법을 살펴보았습니다. 이 예에서는 문자열을 반복하여 모든 문자를 수집했습니다.

여기서는 문자열을 반복하고 숫자만 수집해야 합니다. 그럼 어떻게 해야 할까요?

  • isdigit() 메서드를 사용하여 리스트 컴프리헨션 내에서 필터링 조건을 설정할 수 있습니다.
  • c.isdigit()c가 숫자이면 True를 반환합니다. 그렇지 않으면 False를 반환합니다.
>>> str3 = 'python3'
>>> digits = [c for c in str3 if c.isdigit()]
>>> digits
['3']

문자열이 특정 하위 문자열로 시작하는지 확인

문자열이 특정 하위 문자열로 시작하는지 확인하려면 startswith() 문자열 메서드를 사용할 수 있습니다. str1.startswith(substring)str1이 하위 문자열로 시작하는 경우 True를 반환합니다. 그렇지 않으면 False를 반환합니다.

다음은 몇 가지 예입니다.

>>> str4 = 'coding'
>>> str4.startswith('co')
True
>>> str5 = 'python'
>>> str5.startswith('co')
False

문자열이 특정 하위 문자열로 끝나는지 확인

짐작하셨겠지만, 문자열이 주어진 하위 문자열로 끝나는지 확인하려면 endswith() 메서드를 사용할 수 있습니다.

>>> str5 = 'python'
>>> str5.endswith('on')
True

리스트 컴프리헨션 내부에서 문자열 메서드를 사용하여 불리언 리스트인 ends_with를 얻을 수도 있습니다.

>>> strs = ['python','neon','nano','silicon']
>>> ends_with = [str.endswith('on') for str in strs]
>>> ends_with
[True, True, False, True]

리스트의 요소를 문자열로 결합

문자열을 문자 리스트로 분할하는 방법은 이미 살펴보았습니다. 이제 리스트의 요소를 문자열로 결합하는 역 연산을 어떻게 수행할까요?

이렇게 하려면 다음 구문과 함께 join() 문자열 메서드를 사용할 수 있습니다: separator.join(some-list).

리스트의 요소를 단일 문자열로 결합하기만 하면 되므로 구분 기호가 필요하지 않습니다. 따라서 구분 기호를 빈 문자열로 설정합니다.

>>> list_1 = ['p','y','t','h','o','n','3']
>>> ''.join(list_1)
'python3'

파이썬 사전 만들기

리스트 컴프리헨션이 기존 이터러블에서 새 리스트를 만드는 데 도움이 되는 것처럼, 딕셔너리 컴프리헨션은 기존 이터러블에서 새 사전을 구성하는 데 도움이 될 수 있습니다.

파이썬 딕셔너리 컴프리헨션은 즉석에서 사전을 만드는 데 도움이 되는 구조를 제공하는 강력한 한 줄 코드입니다.

여기 문자열 리스트인 names가 있습니다.

>>> names = ['Joe','Amy','Jake','Florence']

이름 문자열을 키로, 문자열 길이를 값으로 포함하는 사전 names_d를 만듭니다.

>>> names_d = {name:len(name) for name in names}
>>> names_d
{'Joe': 3, 'Amy': 3, 'Jake': 4, 'Florence': 8}

조건부로 변수에 값 할당

때로는 특정 조건에 따라 변수에 값을 할당해야 할 수도 있습니다.

예를 들어 개인의 나이와 같은 사용자 입력을 읽을 수 있습니다. 그리고 입력 값에 따라 파티 참석 여부를 결정할 수 있습니다.

파이썬에서 이 조건부 할당을 수행하기 위해 삼항 연산자를 사용하여 다음과 같은 한 줄 코드를 작성할 수 있습니다.

>>> age = 21
>>> allowed = True if age >= 18 else False
>>> allowed
True

🔖 파이썬의 삼항 연산자에 대해 자세히 알아보세요.

모든 순열 생성

순열은 그룹에서 요소의 가능한 배열을 나타냅니다. 그룹에 n개의 고유한 요소가 있다면 n! 개의 배열 가능한 방법이 있습니다 — 따라서 n!개의 순열이 존재합니다.

다음 문자 리스트를 사용해 보겠습니다.

>>> letters = ['a','b','c']

주어진 이터러블의 가능한 모든 순열을 생성하기 위해 itertools 모듈의 permutations를 사용할 수 있습니다.

>>> letters_p = permutations(letters)
>>> letters_p
<itertools.permutations object at 0x0127AF50>

보시다시피 permutations(iterable)을 사용하면 for 루프를 사용하여 반복할 수 있는 순열 객체가 반환됩니다.

>>> for p in letters_p:
...     print(p)
...
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')

하지만 순열 객체를 리스트로 캐스팅하여 한 줄 표현으로 다시 작성할 수 있습니다.

>>> letters_p = list(permutations(letters))
>>> letters_p
[('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]

여기에는 3개의 고유한 요소가 있으며 3!=6개의 가능한 순열이 있습니다.

리스트의 하위 집합 생성

때로는 리스트나 다른 이터러블에서 특정 크기의 가능한 모든 하위 집합을 구성해야 할 수도 있습니다. 문자 리스트를 사용하고 크기가 2인 모든 하위 리스트를 가져와 보겠습니다.

이를 위해 itertools 모듈의 combinations를 사용할 수 있습니다.

>>> from itertools import combinations
>>> letters_2 = list(combinations(letters,2))
>>> letters_2
[('a', 'b'), ('a', 'c'), ('b', 'c')]

결론

이 튜토리얼에서는 리스트와 문자열에 대한 일반적인 작업을 수행하는 데 유용한 파이썬 원라이너를 살펴보았습니다. 또한 파이썬 리스트 및 딕셔너리 컴프리헨션과 같은 원라이너와 원하는 작업을 수행하기 위해 내장 함수를 함께 사용하는 방법을 배웠습니다.

다음 단계로 초보자에게 친숙한 파이썬 프로젝트 목록을 확인해 보세요.