정글 TIL 13(01.23)

김동준·2024년 1월 22일

Jungle

목록 보기
4/11

파이썬 문법 정리

리스트 더 보기

list.append(x)
리스트 끝에 항목을 더합니다. a[len(a):] = [x]와 동등합니다.

list.extend(iterable)
리스트의 끝에 이터러블의 모든 항목을 덧붙여서 확장합니다. a[len(a):] = iterable과 동등합니다.

list.insert(i, x)
주어진 위치에 항목을 삽입합니다. 첫 번째 인자는 삽입되는 요소가 갖게 될 인덱스입니다. 그래서 a.insert(0, x)는 리스트의 처음에 삽입하고, a.insert(len(a), x)는 a.append(x)와 동등합니다.

list.remove(x)
리스트에서 값이 x와 같은 첫 항목을 삭제합니다.

list.pop([i]) # i는 매개변수가 선택적임을 뜻함
리스트에서 주어진 위치에 있는 항목을 삭제하고, 그 항목을 돌려줍니다. 인덱스를 지정하지 않으면,리스트의 마지막 항목을 삭제하고 돌려준다.

list.clear()
리스트의 모든 항목을 삭제합니다. del a[:]와 동등합니다.

list.index(x[, start[, end]])
리스트에 있는 항목 중 값이 x와 같은 첫 번째 것의 0부터 시작하는 인덱스를 돌려줍니다. start와 end는 슬라이스 표기법처럼 해석됩니다.

list.count(x)
리스트에서 x가 등장하는 횟수를 돌려줍니다.

list.sort(*, key=None, reverse=False)
리스트의 항목들을 제자리에서 정렬합니다.

list.reverse()
리스트의 요소들을 제자리에서 뒤집습니다.

list.copy()
리스트의 얕은 사본을 돌려줍니다. a[:]와 동등합니다.

fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
fruits.count('apple')
2
fruits.count('tangerine')
0
fruits.index('banana')
3
fruits.index('banana', 4) # Find next banana starting at position 4
6
fruits.reverse()
fruits
['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange']
fruits.append('grape')
fruits
['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange', 'grape']
fruits.sort()
fruits
['apple', 'apple', 'banana', 'banana', 'grape', 'kiwi', 'orange', 'pear']
fruits.pop()
'pear'
fruits
['apple', 'apple', 'banana', 'banana', 'grape', 'kiwi', 'orange']

리스트를 스택으로 사용하기
리스트 메소드를 사용하면 추가된 마지막 요소가 검색된 첫 번째 요소(LIFO, Last In First Out)인 스택으로 목록을 매우 쉽게 사용할 수 있습니다. 스택 맨 위에 항목을 추가하려면 append()를 사용합니다. 스택 상단에서 항목을 검색하려면 pop() 명시적인 인덱스 없이 사용하세요.

stack = [3,4,5]
stack.append(6)
stack
[3, 4, 5, 6]
stack.pop()
6
stack
[3, 4, 5]
stack.pop()
5
stack
[3, 4]

리스트를 큐로 사용하는 것도 가능한데, 처음으로 넣는 요소가 처음으로 꺼내지는 요소입니다. (FIFO) 하지만, 리스트는 이 목적에는 효율적이지 않습니다. 리스트의 끝에 덧붙이거나 끝에서 꺼내는 것은 빠르지만, 리스트의 머리에 덧붙이거나 머리에서 꺼내는 것은 느립니다.
큐를 구현하려면 양 끝에서 덧붙이기와 꺼내기가 모두 빠르게 설계된 collections.deque를 사용하면 됩니다.

from collections import deque
queue = deque(["Eric", "john", "Michel"])
queue = append("Terry")
queue.append("Terry")
queue.append("Graham")
queue.popleft()
'Eric'
queue.popleft()
'john'
queue
deque(['Michel', 'Terry', 'Graham'])

리스트 컴프리헨션은 리스트를 만드는 간결한 방법을 제공합니다. 흔한 용도는, 각 요소가 다른 시퀀스나 이터러블의 멤버들에 어떤 연산을 적용한 결과인 리스트를 만들거나, 어떤 조건을 만족하는 요소들로 구성된 서브 시퀀스를 만드는 것입니다.

squares = []
for x in range(10):
    squares.append(x**2)
squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81

이것은 x라는 이름의 변수를 만들고(또는 덮어쓰고) 루프가 종료된 후에도 남아있게 만드는 것에 유의하세요. 어떤 부작용도 없이, 제곱수의 리스트를 이런 식으로 계산할 수 있습니다.

squares = []
for x in range(10):
    squares.append(x**2) 
squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81

이는 다음과 동등합니다.

combs = []
for x in [1,2,3]:
    for y in [3,1,4]:
        if x != y:
            combs.append((x,y))         
combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
vec = [-4, -2, 0, 2 ,4]
[x * 2 for x in vec]
[-8, -4, 0, 4, 8]
[x for x in vec if x >= 0]
[0, 2, 4]
freshfruis = ['banana', 'loganberry    ', 'passion fruit   ']
[weapon.strip() for weapon in freshfruits]
['banana', 'loganberry', 'passion fruits']
[(x, x**2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
[x, x**2 for x in range(6)] # the tuple must be parenthesized, otherwise an error is raised
SyntaxError: did you forget parentheses around the comprehension target?
vec = [[1,2,3], [4,5,6], [7,8,9]]
[num for elem in vec for num in elem] # flatten a list using a listcomp with two 'for'
[1, 2, 3, 4, 5, 6, 7, 8, 9]

리스트 컴프리헨션은 복잡한 표현식과 중첩된 함수들을 포함할 수 있습니다.

from math import pi
[str(round(pi, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']

리스트 컴프리헨션의 첫 표현식으로 임의의 표현식이 올 수 있는데, 다른 리스트 컴프리헨션도 가능합니다.

matrix = [
    [1,2,3,4],
    [5,6,7,8],
    [9,10,11,12],
    ]
[[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
transposed = []

이것은 다음과 같습니다.

for i in range(4):
    transposed_row = []
    for row in matrix:
        transposed_row.append(row[i])
    transposed.append(transposed_row)

transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]


> 복잡한 흐름문 보다 내장 함수를 선호하는 것이 좋습니다. 이 경우에는 zip() 함수가 제 역할을 할 수 있습니다.

list(zip(*matrix))
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]


### python 내장함수
> zip( *iterables, strict = False)
> 여러 반복 가능 항목을 병렬로 반복하여 각 항목의 항목이 포함된 튜플을 생성합니다. 더 공식적으로는, zip() 튜플의 반복자를 반환합니다. 여기서 i 번째 튜플은 iterables 인수 각각의 i번째 요소를 포함합니다.

for item in zip([1,2,3], ['sugar', 'spice', 'everything nice']):
print(item)

(1, 'sugar')
(2, 'spice')
(3, 'everything nice')


> 고려해야할 사항은 전달된 반복 가능 항목의 zip() 길이가 다를 수 있다는 것입니다. 때로는 의도적으로, 때로는 이러한 반복 가능 항목을 준비한 코드의 버그로 인해 발생합니다.
기본적으로 zip() 함수는 가장 짧은 반복 가능 항목이 소진되면 중지됩니다. 더 긴 iterable 항목의 나머지 항목을 무시하고 결과를 가장 짧은 반복 가능 길이로 잘라냅니다.

list(zip(range(3), ['fee', 'fi', 'fo', 'fum']))
[(0, 'fee'), (1, 'fi'), (2, 'fo')]
list(zip(('a', 'b', 'c'), (1,2,3), strict=True))
[('a', 1), ('b', 2), ('c', 3)] # strict=True는 두 항목의 길이가 같다!

for item in zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True):
print(item)

(0, 'fee')
(1, 'fi')
(2, 'fo')
ValueError: zip() argument 2 is longer than argument 1

> itertools.zip_longest()를 활용하면 더 짧은 iterable 항목에 상수 값을 추가하여 모든 반복 가능 항목의 길이를 동일하게 만들 수 있습니다. 

> zip()을 * 연산자와 함께 쓰면 리스트를 unzip할 수 있습니다.

x = [1,2,3]
y = [4,5,6]
list(zip(x,y))
[(1, 4), (2, 5), (3, 6)]
x2, y2 = zip(*zip(x,y))
x == list(x2) and y == list(y2)
True


여기서부턴 숙제... 도저히 시간이 안 나와서요..

### join()

### exit() 함수

### if not :

### pop() 함수

### map() 함수
profile
고민하고 고뇌하는 개발자 (점심, 저녁 메뉴를)

0개의 댓글