데이터를 저장하게 해주는 Data structure (자료구조)
List에는 String, 숫자, boolean 값 등 모든 type의 값을 저장 할수 있다. 또한 서로 다른 type의 값들을 저장 하는것이 가능하다.
korea = [2021, "Hello"]
sandwich = ['peanut butter', 'jelly', 'bread']
list 안의 list
[["Bulls", 23], ["White Sox", 45]]
List의 Index는 [0]과 같이 브라켓 노테이션을 통해 호출 할 수 있다.
브라켓 노테이션 ?
물리 양자역학 개념.....
https://ko.wikipedia.org/wiki/%EB%B8%8C%EB%9D%BC-%EC%BC%93_%ED%91%9C%EA%B8%B0%EB%B2%95
기존 list
hobby = ['reading', 'running', 'swimming']
Index로 수정하기
hobby[0] = 'walking'
hobby = ['walking', 'running', 'swimming']
any_list = [[1,2,3], [4,5,6], [7,8,9], [[10,11,12], 13, 14]];
any_list[3]; # equals [[10,11,12], 13, 14]
any_list[3][0]; # equals [10,11,12]
any_list[3][0][1]; # equals 11
append() 메소드를 이용해 list의 제일 뒤에 요소를 추가할 수 있다.
리스트이름.append(추가할 요소)
실제로 추가해보면
hobby = ['walking', 'running']
hobby.append('swimming')
hobby = ['walking', 'running', 'swimming']
+) append()메소드를 사용해 list에 list 추가하기
def list_append(): my_list = [["John", 23], ["cat", 2]]; add_list = ["dog", 3] my_list.append(add_list) return my_list; my_list = [["John", 23], ["cat", 2], ["dog", 3]];
추가하고자 하는 element가 한개 이상일때 + 를 사용할 수 있다.
+를 이용해 element들을 추가할때는 대괄호[]를 사용해 리스트의 형태로 만든 후 추가해야 한다.
즉, +는 list를 합쳐준다
또한 +를 사용해 list를 합한 값을 다시 저장하고자 하는 변수에 저장해 주어야 한다.list1 = list1 + list2
insert를 사용해 원하는 위치에 element를 삽입할 수 있다.
따라서 insert를 사용할 때에는 추가하고자 하는 element는 물론, 추가하고자 하는 위치(Index)도 지정해주어야 한다.
함수이름.insert(추가하려는index위치, 추가할 element)
pop()메소드를 사용해 List의 뒤에서부터 요소를 제거할 수 있다.
list.pop()
만약 list가 2개의 list 요소로 구성된 다중 상태일때 pop()을 한번 사용하면 하나의 list 요소가 통채로 사라진다
def list_pop():
my_list = [["John", 23], ["cat", 2]];
my_list.pop()
return my_list;
my_list = ["John", 23];
del 키워드를 사용해 지정한 위치(Index)의 요소를 제거할 수 있다.
del 함수이름[제거할 요소의 위치]
위의 del 키워드와 달리 index 정보가 필요하지 않는 remove 메소드가 있다. 이는 제거하고자 하는 element를 입력한다
함수이름.remove(제거하고자 하는 element)
"python"에서 리스트 일부분을 따로 copy 하는 것
"Slice" in Pizza = 한조각!!!
list_name[start : stop]
list_name의 element들 중에서 index[start] 부터 index[stop -1] 까지의 element들 copy 해서 가져온다.
list_name[start : stop : step]
Step : 해당하는 값 만큼 건너뛰어 가져온다
index[start] 부터 index[stop-1] 까지, [step]간격으로 값을 가져온다.
list_name[:stop]
해당 list의 첫 요소부터 stop-1번째 까지 가져온다.
list_name[start:]
해당 list의 index[start]부터 끝까지 가져온다.
오리지널 list를 수정하는 것이 아니라, 새로운 list를 만들어 내는 것이다.
list=[1, 2, 3, 4, 5]
sub_list=list[1:4]
print(f'{sub_list}')
->
[2, 3, 4]
def add_first_and_last_elements(my_list):
length = len(my_list) # my_list의 길이값을 length에 담기
# my_list에 아무것도 담기지 않았을 때 값 = 0
if length == 0:
return 0
# my_list의 값이 1개라면 1개의 값 return
elif length == 1:
return my_list[0]
# my_list의 값이 2개 이상일 때 첫번째와 마지막 요소의 합 호출하기
else:
return (my_list[0]) + (my_list[length-1])
def merge_and_swap(list1, list2):
if len(list2) != 0 and len(list1) != 0:
list1 = list1 + list2
list1.append(list1[0])
list1[0] = list1[-2]
list1[-2] = list1[-1]
list1.pop()
elif (len(list2) == 0 and len(list1) != 0) or (len(list2) != 0 and len(list1) == 0):
list1 = list1 + list2
if len(list1) == 1:
return list1
elif len(list1) > 1:
list1.append(list[0])
list1[0] = list1[-2]
list1.pop()
# else 구문은 생략가능함
else:
return list1
# 함수의 최종 return 값
return list1
unit test
test 값
1. list1=[1, 2, 3, 4] / list2 = [5, 6, 7]
2. list1=[1] / list2=[2]
3. list1=[] / list2=[]
4. list1=["one"] / list2 = []
5. list1=["one", "two", "three"] / list2 = ["four", "five"]
test 결과
1. [7, 2, 3, 4, 5, 6, 1]
2. [2, 1]
3. []
4. ["one"]
5. ["five", "two", "three", "four", "one"]
def remove_odd_numbers(numbers):
for number in numbers[:]:
if number%2 != 0 :
numbers.remove(number)
return numbers
처음에 짰던 코드는 다음과 같다.
def remove_odd_numbers(numbers):
for number in numbers:
if number%2 != 0 :
numbers.remove(number)
return numbers
이렇게 하니 numbers=[1, 4, 6, 8, 5]일때 결과값이 [4, 6, 8, 5]로 나온다!!! 왜 5가 사라지지 않는건지..
(이 단계에서 숫자 하나하나 대입하며 풀어봤다면 스스로 원인을 알았을 수도 있을것 같다! 안해서 문제다)
나와 같은 문제에서 헤매는 사람들이 많았다. 여러사람들의 조언을 보니 remove()메소드로 인해 오리지널 list의 값이 for문이 진행되는 동안 계속 변했기 때문이라고 한다.
그렇다면 홀수인 요소는 제거하되 오리지널 list는 변화시키지 않는방법을 찾아야 한다.
바로 직전에 공부했던 개념중에 List Slicing 이라는 것이 있다.
Slicing은 modifying이 아닌 copying이라고 했다!! 이를 이용해 코드를 다시 작성해 보았다.
def remove_odd_numbers(numbers):
for number in numbers[:]:
if number%2 != 0 :
numbers.remove(number)
return numbers
위와 같이 오리지널 list인 numbers를 사용해 for문을 돌리는 것이 아니라, numbers의 처음부터 끝까지의 요소를 Slicing 하여 이것 안에서 for문을 돌리도록 했다. 이렇게 하면 오리지널 list를 훼손시키지 않아 의도한 대로 for문을 돌릴 수 있다.
참고자료 : https://devpouch.tistory.com/110
list와 같은 Data structure(자료 구조)
list는 수정이 가능하지만 tuple은 한번 선언되면 수정이 불가능하다!!
일반괄호 () 를 사용한다
my_tuple = (1, 2, 3)
앞서 말했듯 수정은 불가하다.
단, 읽는 방법(Index 사용), slicing 방법은 list와 같다.
list와 거진 비슷하면서 (수정이 안된다는 것 제외) 굳이 tuple을 따로 사용하는 이유는??
list가 tuple보다 차지하는 메모리 용량이 더 크다.
따라서 수정이 필요없고 간단한 형태의 데이터를 표현할 땐 tuple이 훨씬 더 효과적이다.
append가 안되는 tuple..
처음에 모든 listrk 6개의 요소를 갖고있다는걸 못보고... 램덤갯수인줄 알고 for문을 돌리려 했다.
def convert_list_to_list_of_tuples(my_list):
## 이 함수를 구현해 주세요
for i in range (2, len(my_list), 2):
my_tuple = tuple(my_list[i:i+2])
return my_tuple
->
list가 [1, 2, 3, 4, 5, 6] 일때 my_tuple = (5, 6)
i 의 값이 2부터 2의 간격으로 my_list 요소 길이갯수 만큼 진행될 동안 계속해서 my_tuple의 값이 변화하여 마지막 값인 (5, 6)만 출력되었다.
당연히 tuple은 append 가 안되 이걸 어떻게하나.. 하고 막막했는데 앗차! 문제를 잘못봤구나!^__^ 난이도가 쑤욱 내려갔다.
def convert_list_to_list_of_tuples(my_list):
my_list = tuple(my_list[:2]), tuple(my_list[2:4]), tuple(my_list[4:])
return list(my_list)
->
my_list = [1, 2, 3, 4, 5, 6]일때 결과
=> my_list = [(1, 2), (3, 4), (5, 6)]
참고 자료 : https://yeolco.tistory.com/84 [열코의 프로그래밍 일기]
여러개의 튜플을 합쳐 표현하는 법을 찾았다!!!!!!!
tuple1 = (1, 2)
tuple2 = ("hi", "bye")
tuple3 = tuple1 + tuple2
print(tuple3) # (1, 2, 'hi', 'bye') 출력
tuple1 = (1, 2)
tuple2 = ("hi", "bye")
tuple3 = (tuple1 , tuple2)
print(tuple3) # ((1, 2), ('hi', 'bye')) 출력
list와 친척사이
list와 마찬가지고 여러 다양한 타입의 element들을 저장할 수 있다.
But, 차이점이 존재한다.
set1 = {1, 2, 3, 1}
print(set1)
-> {1, 2, 3}
set1 = {1, 2, 3}
이 방법을 사용할 때에는 list를 parameter로 전달해야 한다.
set2 = set([1, 2, 3])
이런 특성때문에 set() 함수는 list를 set으로 변환하고 싶을 때 사용한다.
set은 요소들이 순차적으로 저장되지 않기 때문에 append방법은 어울리지 않는다. 따라서 set에 새 요소를 추가할때에는 add 라는 함수를 사용한다.
my_set = {1, 2, 3}
my_set.add(4)
print(my_set)
-> {1, 2, 3, 4}
index의 의미가 없기 때문에 값을 지정하여 삭제하는 remove 함수를 사용한다.
Set에 어떠한 값이 이미 존재하는지 알아보는것을 look up 이라 한다.
set 에서 look up 할땐 in 키워드를 사용한다.
in 키워드는 그 결과가 True / False 로 나타난다. 따라서 그 결과에 따라 무언가를 출력하고 싶다면 if 문과 함께 사용하면 된다.
my_set = {1, 2, 3} if 1 in my_set: print("1 is in the set") -> 1 is in the set
set은 교집합과 합집할을 구할 때 사용될 수 있다.
교집합 = Intersection
합집합 = Union
set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8, 9}
print(set1 & set2)
> {4, 5, 6}
print(set1.intersection(set2))
> {4, 5, 6}
print(set1 | set2)
> {1, 2, 3, 4, 5, 6, 7, 8, 9}
print(set1.union(set2))
> {1, 2, 3, 4, 5, 6, 7, 8, 9}
얘도 자료구조!!
my_dic = {"key1" : "value1", "key2" ; "value2"}
만약 key값이 중복된다면, 이후의 key에 대한 value가 기존의 것을 대치한다.
dict1 = {1 : "one", 1 : "two"}
print(dict1)
-> {1 : "two"}
딕셔너리이름[새로운key이름] = 새로운value이름
dict = {1 : "one", 2 : "two"}
dict[1] = "hello"
print(dict)
->
{1 : "hello", 2 : "two"}
key 값을 사용한다!
del 딕셔너리이름[삭제하려는key값]
Jimin = {"가명" : "지민(Jimin)", "본명" : "박지민", "생년월일" : "1995.10.13", "출생지" : "부산", "포지션" : "리드래퍼와 메인댄서", "학력" : "글로벌사이버대학교"}
for key in Jimin:
print(f'{key} : {Jimin[key]}')
가명 : 지민(Jimin)
본명 : 박지민
생년월일 : 1995.10.13
출생지 : 부산
포지션 : 리드래퍼와 메인댄서
학력 : 글로벌사이버대학교