소연의_개발일지

리스트

리스트 객체의 메서드

list.append(x)

a = [1, 2, 3]
a.append(4)
print(a)
# [1, 2, 3, 4]

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


list.extend(iterable)

  • 리스트의 끝에 이터러블의 모든 항목을 덧붙여서 확장합니다. a[len(a):] = iterable 와 동등합니다.
  • iterable 객체 - 반복 가능한 객체. → list, dict, set, str, bytes, tuple, range
  • iterator 객체 - 값을 차례대로 꺼낼 수 있는 객체
a = [1, 2, 3]
b = [4, 5, 6]
a.extend(b)
print(a)
# [1, 2, 3, 4, 5, 6]

 

list.insert(i, x)

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

 

list.remove(x) 

a = [1, 2, 3, 2]
a.remove(2)
print(a)
# [1, 3, 2]

  • 리스트에서 값이 x 와 같은 첫 번째 항목을 삭제합니다. 그런 항목이 없으면 ValueError를 일으킵니다.

 

list.pop([i])

  • 리스트에서 주어진 위치에 있는 항목을 삭제하고, 그 항목을 돌려줍니다. 인덱스를 지정하지 않으면, a.pop() 은 리스트의 마지막 항목을 삭제하고 돌려줍니다.
  • (메서드 시그니처에서 i 를 둘러싼 대괄호는 매개변수가 선택적임을 나타냅니다. 그 위치에 대괄호를 입력해야 한다는 뜻이 아닙니다. 이 표기법은 파이썬 라이브러리 레퍼런스에서 지주 등장합니다.
a = [1, 2, 3]
print(a.pop(1))
# 2
print(a)
# [1, 3]

 


list.clear()

a = [1, 2, 3]
a.clear()
print(a)
# []

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

 


list.index(x[, start[, end]])

a = [1, 2, 3, 2]
print(a.index(2))
# 1
  • 리스트에 있는 항목 중 값이 x 와 같은 첫 번째 것의 0부터 시작하는 인덱스를 돌려줍니다. 그런 항목이 없으면 [ValueError](<https://docs.python.org/ko/3/library/exceptions.html#ValueError>) 를 일으킵니다.
  • 선택적인 인자 start 와 end 는 슬라이스 표기법처럼 해석되고, 검색을 리스트의 특별한 서브 시퀀스로 제한하는 데 사용됩니다. 돌려주는 인덱스는 start 인자가 아니라 전체 시퀀스의 시작을 기준으로 합니다.

 


list.count(x)

  • 리스트에서 x 가 등장하는 횟수를 돌려줍니다.
a = [1, 2, 3, 2]
print(a.count(2))
# 2

 

 


list.sort(***, key=None, reverse=False)

a = [3, 1, 2]
a.sort()
print(a)
# [1, 2, 3]

 


list.reverse()

a = [1, 2, 3]
a.reverse()
print(a)
# [3, 2, 1]

  • 리스트의 요소들을 제자리에서 뒤집습니다.

 


list.copy()

a = [1, 2, 3]
b = a.copy()
print(b)
# [1, 2, 3]

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

 


이런 메서드들은 리스트를 수정할 뿐 반환 값이 출력되지 않는다. — 기본 none을 돌려준다.

이것은 파이썬에서 모든 가변 자료 구조들에 적용되는 설계 원리이다.

모든 데이터를 정렬하거나 비교할 수 없다.

  • 예를 들어, 정수를 문자열과 비교할 수 없고 None을 다른 형과 비교할 수 없기 때문에 [None, 'hello', 10] 는 정렬되지 않습니다.

또한 정의된 대소 관계가 없는 형이 있습니다.

  • 예를 들어, 3+4j < 5+7j는 올바른 비교가 아닙니다.

 


리스트를 스택으로 사용하기

리스트 메서드들은 리스트를 스택으로 사용하기 쉽게 만드는데, 마지막에 넣은 요소가 처음으로 꺼내지는 요소이다. (”last-in, first-out”).

스택의 꼭대기(마지막)에 항목을 넣으려면 append()를 사용한다.

스택의 꼭대기(마지막)에서 값을 꺼내려면 명시적인 인덱스 없이 pop()을 사용한다.

stack = [3, 4, 5]
stack.append(6)
stack.append(7)
print(stack) #[3, 4, 5, 6, 7]

stack.pop() # 7
print(stack) # [3, 4, 5, 6]

stack.pop() # 6
stack.pop() #5
print(stack) # [3, 4]

리스트를 큐로 사용하기

리스트를 큐로 사용하는 것도 가능한데, 처음으로 넣은 요소가 처음으로 꺼내지는 요소입니다 ("first-in, first-out")

하지만, 리스트는 이 목적에는 효율적이지 않습니다. 리스트의 끝에 덧붙이거나, 끝에서 꺼내는 것은 빠르지만, 리스트의 머리에 덧붙이거나 머리에서 꺼내는 것은 느립니다 (다른 요소들을 모두 한 칸씩 이동시켜야 하기 때문입니다).

큐를 구현하려면,

양 끝에서의 덧붙이기와 꺼내기가 모두 빠르도록 설계된 [collections.deque]https://python.flowdas.com/library/collections.html#collections.deque>)  를 사용하세요.

>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry")           # Terry 도착
>>> queue.append("Graham")          # Graham 도착
>>> queue.popleft()                 # 처음 도착한 사람이 이제 떠납니다
'Eric'
>>> queue.popleft()                 # 두번째 도착한 사람이 이제 떠납니다
'John'
>>> queue                           # 도착한 순서대로 남아있는 큐
deque(['Michael', 'Terry', 'Graham'])

리스트 컴프리헨션

리스트 컴프리헨션은 리스트를 만드는 간단한 방법을 제공합니다.

일반적으로 다른 시퀀스나 반복 가능한 객체의 각 원소에 대해 일부 작업을 수행하여 새로운 리스트를 만들거나,

특정 조건을 충족하는 원소들의 부분 시퀀스를 만드는 데 사용됩니다.

 

예를 들어, 제곱의 리스트를 만들고자 하는 경우:

squares = []
for x in range(10):
    squares.append(x**2)

# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

 

리스트 컴프리헨션을 사용하여 동일한 결과를 얻을 수 있습니다. (훨씬 간결하고 쉬운 방식)

squares = [x**2 for x in range(10)]

 

또한 같은 식을 람다식을 이용해서 풀 수 있다. 

(여기는 아직 이해가 안됨. 람다식 이해하고 다시 업데이트 할 예정)

squares = list(map(lambda x: x**2, range(10)))

설명: 

이 코드는 range(10)의 각 요소에 x**2 함수를 적용하여 squares라는 리스트를 만드는데요.

map() 함수가 각 요소에 함수를 적용하고 맵 객체를 반환하며, 그 결과를 list() 함수를 사용하여 리스트로 변환합니다.

결과적으로 0부터 9까지의 숫자의 제곱이 순서대로 담긴 리스트가 생성됩니다.

 

lambda는 한 줄짜리 함수를 만드는 데 사용하는 키워드입니다. 람다 함수는 이름이 없으며, 한 번 사용할 수 있는 일회용 함수입니다.

예를 들어, lambda x: x**2 는 입력값 x를 받아서 x의 제곱을 반환하는 함수입니다.

이 함수를 사용하면 map()과 같은 함수에서 간단한 함수를 만들 수 있습니다.

map() 함수는 두 개의 인자를 받습니다. 첫 번째 인자는 함수이며, 두 번째 인자는 시퀀스(리스트, 튜플 등)입니다. map() 함수는 시퀀스의 각 요소에 함수를 적용하여 새로운 시퀀스를 반환합니다.

 

예를 들어, list(map(lambda x: x**2, [1, 2, 3, 4, 5])) 는 [1, 4, 9, 16, 25] 를 반환합니다.

이 코드에서는 lambda 함수를 사용하여 각 요소의 제곱을 구하고,

map() 함수를 사용하여 각 요소에 함수를 적용하여 새로운 리스트를 생성합니다.

 


리스트 컴프리헨션은 괄호 안에 표현식을 포함한 후 for 절이 따라옵니다.

그 다음에는 for 나 if 절이 0개 이상 따라옵니다.

결과는 그 뒤 따라오는 for 나 if 절의 문맥에서 표현식을 평가하여 새로운 리스트를 만듭니다.

예를 들어, 두 리스트의 요소를 결합하되 서로 같지 않은 경우를 만들려면 다음과 같이 할 수 있습니다:

[x + y for x in [1, 2, 3] for y in [3, 1, 4] if x != y]
# [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

이 코드는 다음과 동일합니다:

results = []
for x in [1, 2, 3]:
    for y in [3, 1, 4]:
        if x != y:
            results.append(x + y)
# [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

두 코드 모두 for 과 if문의 순서가 같음에 유의해야 합니다.

표현식이 튜플이면 (즉 앞의 예에서 (x, y)), 반드시 괄호로 둘러싸야 합니다.

 

예시:

vec = [-4, -2, 0, 2, 4]

# 값을 두배로 해서 새 리스트를 만든다.
var_1 = [x * 2 for x in vec]
print(var_1)  # [-8, -4, 0, 4, 8]

# 음수를 제외하도록 리스틀르 필터링한다.
var_2 = [y for y in vec if y >= 0]
print(var_2) # [0, 2, 4]

# 모든 요소에 함수를 적용한다.
var_3 = [abs(i) for i in vec]
print(var_3) # [4, 2, 0, 2, 4]

# 각 요소에 메서드를 호출한다. 이 경우는 공백 없애주는 함수 적용
freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
var_4 = [weapon.strip() for weapon in freshfruit]
print(var_4) # ['banana', 'loganberry', 'passion fruit']

# (숫자, 제곱)과 같은 2-튜플 리스트를 만든다.
var_5 = [(z, z**2) for z in range(6)]
print(var_5) # [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
# 튜플은 괄호로 묶어야 한다. 그렇지 않으면 에러가 발생한다.
# SyntaxError: invalid syntax 에러가 날 수 있음.

# 두 개의 'for'을 갖는 리스트 컴프리헨션으로 리스트를 평평하게 만들기
vec_2 = [[1,2,3],
         [4,5,6],
         [7,8,9]]
var_6 = [num for elem in vec_2 for num in elem]
print(var_6) # [1, 2, 3, 4, 5, 6, 7, 8, 9]

 

 

마지막 컴프리헨션 이해하지 못함..

다시 볼 코드

# 두 개의 'for'을 갖는 리스트 컴프리헨션으로 리스트를 평평하게 만들기
vec_2 = [[1,2,3],
         [4,5,6],
         [7,8,9]]
var_6 = [num for elem in vec_2 for num in elem]
print(var_6) # [1, 2, 3, 4, 5, 6, 7, 8, 9]

설명:

이것은 두 개의 "for" 루프를 가진 리스트 컴프리헨션의 예입니다.

이것은 리스트의 리스트를 하나의 리스트로 평평하게 만듭니다.

이 예에서 vec_2는 세 개의 하위 리스트를 가진 리스트입니다.

리스트 컴프리헨션은 vec_2의 각 하위 리스트의 각 요소를 반복하고 새 리스트 var_6에 추가합니다.

첫 번째 "for" 루프는 vec_2의 각 하위 리스트를 반복하고 두 번째 "for" 루프는 하위 리스트의 각 요소를 반복합니다.

결과적으로 생성된 var_6 리스트는 [1, 2, 3, 4, 5, 6, 7, 8, 9]입니다.

profile

소연의_개발일지

@ssoyxon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!