[파이썬] 숨은 기능 17가지

chrisjune
8 min readAug 6, 2019

매우 유용한 파이썬의 팁을 공유합니다.

1. 변수 값 swap

>>> a, b = 1, 10
>>> print(a, b)
1 10
>>> a, b = b, a
>>> print(a, b)
10 1

2. 리스트 내용으로 문자열 만들기

>>> a = ['Python', 'is', 'awesome']
>>> print(' '.join(a))
Python is awesome

문자열 합치는 방법은 + 를 사용할 수 도 있지만, 'a'+'b'+'c'처럼 여러 문자열을 더해 나갈 때마다 문자열 객체를 생성하기 때문에 메모리 관리측면에서 효율적이지 않습니다. 따라서 문자열을 합칠땐 join을 사용하는 것이 좋습니다.

3. 가장 빈번하게 등장한 요소 찾기

>>> a = [1,2,3,1,2,3,1,1,1,1]
>>> from collections import Counter
>>> cnt = Counter(a)
>>> print(cnt.most_common(3))
[(1, 6), (2, 2), (3, 2)]
>>> print(cnt.most_common(1))
[(1, 6)]

most_common메소드의 인자값으로 상위 몇번째 요소를 보여줄지 정할 수 있으며, 인자를 넘기지 않는 경우 모든 요소를 반환합니다.

4. 단어의 순서 상관 없이 비교하기

>>> from collections import Counter
>>> str1 = 'bake'
>>> str2 = 'kabe'
>>> Counter(str1)
Counter({'b': 1, 'a': 1, 'k': 1, 'e': 1})
>>> Counter(str1) == Counter(str2)
True

5. 문자열 거꾸로 출력하기

# 문자열 거꾸로 출력 -1 
>>> from string import ascii_letters
>>> a = ascii_letters
>>> a
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> print(a[::-1])
ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba
# 문자열 거꾸로 출력 -2
>>> for char in reversed(a):
... print(char)
# 숫자 거꾸로 출력
>>> num = 123456789
>>> print(int(str(num)[::-1]))
987654321

6. 리스트 거꾸로 출력하기

>>> a = [5,4,3,2,1]
>>> a[::-1]
[1, 2, 3, 4, 5]
>>> for ele in a:
... print(ele)

7. 2차원행렬의 전치행렬 구하기

>>> array2d = [[1,2], [3,4], [5,6]]
>>> transposed = list(zip(*array2d))
>>> transposed
[(1, 3, 5), (2, 4, 6)]

전치행렬은 행렬을 역슬래시 방향으로 행과 열을 뒤바꾼 행렬입니다. 이를 구하기 위하여, zip 함수를 사용하여 동일한 위치의 요소를 묶어내면, 전치행렬을 구하는 것과 동일한 결과를 얻을 수 있습니다.

8. 연쇄 비교

>>> a = 10
>>> 5 < a < 50
True
>>> 10 == a <= 10
True

9. 연쇄 함수호출

>>> def product(a, b):
... return a * b

>>> def add(a, b):
... return a + b

>>> i = True
>>> (product if i else add)(5, 7)
35
>>> i = False
>>> (product if i else add)(5, 7)
12

10. 리스트 복사하기

# 단순복사
>>> a = [1, 2, [3, 4]]
>>> b = a
>>> b
[1, 2, [3, 4]]
>>> b[0] = 10
>>> b
[10, 2, [3, 4]]
>>> a
[10, 2, [3, 4]]
# 얕은 복사 - 1
>>> a = [1, 2, [3, 4]]
>>> b = a[:]
>>> b[0] = 10
>>> b
[10, 2, [3, 4]]
>>> a
[1, 2, [3, 4]]
# 얕은 복사 - 2
>>> a = [1, 2, [3, 4]]
>>> b = a.copy()
>>> b[0] = 10
>>> b
[10, 2, [3, 4]]
>>> a
[1, 2, [3, 4]]
# 깊은 복사
>>> from copy import deepcopy
>>> a = [1, 2, [3, 4]]
>>> b = deepcopy(a)
>>> b[0] = 10
>>> b[2][0] = 100
>>> b
[10, 2, [100, 4]]
>>> a
[1, 2, [3, 4]]

11. 딕셔너리 요소 얻기

>>> dic = {'a': 1, 'b':2}
>>> dic.get('a')
1
>>> dic.get('d')
>>> dic.get('c', 3)
3

Dictionary 객체의 get메소드는 존재하는 요소를 반환합니다. 존재하지 않는 요소를 얻으려고 하면 None값을 반환합니다. get 메소드의 두번째 인자로 None 대신 반환할 기본값을 지정할 수도 있습니다.

12. 값으로 딕셔너리 정렬하기

# 값으로 정렬하기 - 1 
>>> dic = {'a': 4, 'b':3, 'c':2, 'd':1}
>>> print(sorted(dic))
['a', 'b', 'c', 'd']
>>> print(sorted(dic.items()))
[('a', 4), ('b', 3), ('c', 2), ('d', 1)]
>>> print(sorted(dic.items(), key=lambda x:x[1]))
[('d', 1), ('c', 2), ('b', 3), ('a', 4)]
# 값으로 정렬하기 - 2
>>> from operator import itemgetter
>>> sorted(dic.items(), key=itemgetter(1))
[('d', 1), ('c', 2), ('b', 3), ('a', 4)]
# 값으로 정렬하기 - 3
>>> sorted(dic, key=dic.get)
['d', 'c', 'b', 'a']

내장 메소드인 sorted()메서드를 활용하여 딕셔너리를 정렬할 수 있습니다. ‘key’ 인자를 활용하여 정렬 순서기준을 변경할 수 있습니다.

13. For — Else구문

>>> for ele in [1,2,3,4]:
... if ele > 4:
... break
...
...
... else:
... print('5 이상인 숫자 없음')
...
...
5 이상인 숫자 없음

for와 함께 사용하는 else는 for 문이 중간에 break등으로 끊기지 않고, 끝까지 실행됐을 때 수행되는 코드를 담고있습니다.

14. 리스트를 컴마로 구분한 문자열로 만들기

>>> li = ['a', 'b', 'c', 'd']
>>> ','.join(li)
'a,b,c,d'
>>> li = [1,2,3,4]
>>> ','.join(str(i) for i in li)
'1,2,3,4'
>>> li = [1,'two',3,'four']
>>> ','.join(str(i) for i in li)
'1,two,3,four'

내장메서드 join은 iterable 객체의 문자열을 합쳐서 반환합니다. 따라서 숫자리스트의 경우 문자열로 변환하기 위하여, 위의 예에서는 list comprehension을 사용하였습니다.

15. 딕셔너리 합치기

>>> dic1 = {'a':1}
>>> dic2 = {'b':2}
>>> {**dic1, **dic2}
{'a': 1, 'b': 2}
dic1 = {'a':1}
dic2 = {'a':2}
>>> {***dic1, **dic2}
{'a': 2}

첫번째 예는, 언패킹을 활용하여 새로운 딕셔너리를 생성합니다. 이때 유의해야할 점은 언패킹후 key가 겹칠 경우, 나중에 언패킹한 딕셔너리의 값을 사용합니다.

>>> dic1.update(dic2)
>>> dic1
{'a': 1, 'b': 2}

update메소드를 활용하여 합칠 수 있습니다. key가 겹칠 경우 update 메소드의 인자의 딕셔너리값으로 갱신합니다.

16. 리스트의 가장 작은, 가장 큰 값의 index 얻기

# 가장 작은 값의 index
>>> li = [10,20,30,40]
>>> def min_index(li):
... return min(range(len(li)), key=li.__getitem__)
...
>>> min_index(li)
0
# 가장 큰 값의 index
>>> def max_index(li):
... return max(range(len(li)), key=li.__getitem__)
...
>>> max_index(li)
3

17. 리스트에서 중복값 제거하기

>>> li = [1,2,3,1,2,3,4]
>>> list(set(li))
[1, 2, 3, 4]
>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys(li).keys())
[1, 2, 3, 4]

더 좋은 팁들은 댓글로 남겨주세요! 포스트에 추가하도록 하겠습니다.

참고문서

https://medium.com/hackernoon/python-tricks-101-2836251922e0

--

--