python) list, dictionary

Mongle·2020년 10월 6일
0

Python

목록 보기
8/9

리스트에 요소 추가하기 : append(), insert(), extend()

  • append(요소)
  • insert(인덱스, 요소)
  • extend(리스트)
  • 리스트에 요소를 추가하는 함수들은 모두 파괴적 함수임
list_a = [1,2,3]
list_b = [4,5,6]
print(list_a + list_b)
# [1,2,3,4,5,6]

print(list_a)
# [1,2,3] 비파괴적함수

list_a.extend(list_b)
print(list_a)
# [1,2,3,4,5,6] #파괴적함수

인덱스로 요소 제거하기 : del, pop()

  • del은 함수가 아니라 키워드임
  • pop()은 해당 인덱스의 요소를 출력함
list_a = [1,2,3,4,5,6]
del list_a[1]
print(list_a) # [1,3,4,5,6]

list_a.pop(1) # 3 
print(list_a) # [1,4,5,6]
  • del은 범위를 지정해서 삭제할때, pop은 삭제할 요소를 출력할 때 사용하면 편리함
list_a = [1,2,3,4,5,6]
del list_a[:3]
print(list_a) = [4,5,6]

값으로 요소 제거하기 : remove()

  • 해당 값이 여러개 있을 경우 왼쪽부터 차례대로 제거됨

리스트 탐색 : max(), min(), sum()

  • max(리스트) : 리스트 내부에서 가장 큰 값 찾아서 반환
  • max(1,2,3) 이렇게도 사용할 수 있음

리스트 뒤집기 : reversed()

  • reversed()는 iterator를 리턴한다.
temp = reversed([1,2,3,4,5,6])

for i in temp:
print("첫번째" : i)

for i in temp:
print("두번째" : i)

# 첫번째 for문만 출력됨
# why? 
# reversed()의 결과가 제너레이터이기 때문에 함수의 결과를 여러번 사용할 수 없음
number = [1,2,3,4,5,6]

for i in reversed(number):
	print("첫번째" : i)
    
for i in reversed(number):
	print("두번째" : i)
    
# reversed()와 반복문을 조합할 때는 함수의 결과를 여러번 활용할 수 없음.

추가

리스트를 뒤집을 때는 확장슬라이싱을 활용할 수도 있음.

number = [1,2,3,4,5,6]

for i in number[::-1]:
	print(i)
    
# 문자열에도 사용가능
hi = "안녕하세요"
print(hi[::-1])

리스트의 인덱스와 요소 함께 출력하기 : enumerate()

  • enumerate()는 iterator를 리턴한다.
  • enuberate(리스트)형태로 사용한다.
  • dictionary.items()와 구분해야 함
for i, value in enumerate(ex_list):
	print(f'{i}번째 요소는 {value}이다.')

👍 짚고 넘어가기
'반복할 수 있는 것'iterable(이터러블)이라고 한다.
iterable한 객체라는 것은 내부에 있는 요소를 차례대로 하나씩 꺼낼 수 있는 객체를 의미한다. 리스트, 딕셔너리, 튜플, 문자열 등이 이에 해당한다.
.
이터러블 중에서 next()함수를 적용해서 하나씩 꺼낼 수 있는 요소를 iterator라고 한다.

numbers = [1,2,3,4,5,6]
r_num = reversed(numbers)
# reversed()함수는 이터레이터를 리턴한다.
print("reversed numbers : ", r_num) # <list_reversediterator 주소값>
print(next(r_num)) # 6
print(next(r_num)) # 5

👍 더 중요한거
왜 리스트를 바로 리턴해주지 않고 이터레이터를 리턴해주는 것일까?
메모리의 효율성을 위해서이다. 이터레이터는 새로운 리스트를 만드는 것이 아니라 기존에 있던 리스트를 활용해서 작업하는 것이기 때문에 그때그때 필요한 만큼만 작업할 수 있다.

함수의 매개변수로 함수 전달하기 : map(), filter()

  • map(함수, 리스트) : 함수의 리턴값을 리스트로 만들어 반환한다.
  • filter(함수, 리스트) : 함수가 True를 반환했을 때 매개변수를 리스트로 만들어 반환한다.
def power(item):
    return item * item
def under_3(item):
    return item < 3

list_input_a = [1,2,3,4,5]

# map(함수, 리스트) 함수를 사용합니다.
output_a = map(power, list_input_a)
print("map(power, list_input_a) : ", output_a)
print("list(map(power, list_input_a)) : ", list(output_a))
# [1,4,9,16,25]

# filter(함수, 리스트) 함수를 사용합니다.
output_b = filter(under_3, list_input_a)
print("filter(under_3, list_input_a) : ", output_b)
print("list(filter(under_3, list_input_a)) : ", list(output_b))
# [1,2]

Generator(제너레이터)

map()함수의 리턴값을 그대로 출력해보면

<map object at 주소값>

이런 모양으로 출력된다. 제너레이터를 리턴한 것이다.
제너레이터란,
이터레이터를 직접 만들 때 사용하는 코드이다. 함수 내부에 yield 키워드를 사용하면 해당 함수는 제너레이터 함수가 된다.
제너레이터 함수를 통해 제너레이터 객체를 생성한 후, next(제너레이터 객체) 함수를 사용해 함수 내부의 코드를 실행해야한다. 이때 yield 키워드를 기준으로 실행된다.
제너레이터 객체는 함수의 코드를 조금씩 실행할 때 사용하고, 이는 메모를 효율적으로 사용할 수 있게 해준다.
만약, next()를 호출했는데 yield 키워드를 찾지 못하고 함수가 종료된 경우 StopIteration이라는 예외가 발생한다.


리스트 표현식

#for문으로 새로운 리스트 만들기
array = [1,2,3,4,5,6]
a_array = [i*i for i in array] # [1,4,9,16,25,36]

#조건 추가
b_array = [i*i for i in array if i % 2 == 1] # [1,9,25]

문자열의 join()

  • join()함수를 사용할 때는 문자열로 구성된 리스트여야만 함
  • join()은 리스트의 요소들을 문자열로 연결
numbers = ["1","2","3"]
print("//".join(numbers)) # "1//2//3"
# int로 구성된 리스트를 join하려 할 경우
numbers = [1,2,3]
print("//".join(numbers))

# TypeError: sequence item 0: expected str instance, int found

갯수 세기 : count(찾을 대상)

print("안녕안녕하세요".count("안")) # 3
print("aabbccdd".count("a")) # 2

딕셔너리 내부에 키가 존재하는지 확인하기 : in, get()

if key in dictionary:
	print(key, ":", dictionary[key])
else:
	존재하지 않는 키입니다.
  • get() 함수를 사용할 경우 키가 존재하지 않을 때 None을 리턴함
value = dictionary.get("name")
print("이름", value)
# 만약 name이라는 키가 없을 경우
# 이름 : None
# name이라는 키가 있을 경우
# 이름 : 홍길동

튜플로 몫, 나머지 구하기 : divmod()

a, b = 97, 40
print(divmod(a,b)) # (2, 17)

x, y = divmod(97, 40)
print(x) # 2
print(y) # 17
profile
https://github.com/Jeongseo21

0개의 댓글