TIL #28-1 Python : Repl.it 공부3

채록·2021년 1월 14일
0

짜투리

목록 보기
17/26
post-thumbnail

#29 ~ 39 : List


I. List 기초

데이터를 저장하게 해주는 Data structure (자료구조)

1. List의 data type

List에는 String, 숫자, boolean 값 등 모든 type의 값을 저장 할수 있다. 또한 서로 다른 type의 값들을 저장 하는것이 가능하다.

korea = [2021, "Hello"]

2. List의 구조

  • [] 대괄호로 감싸져 있다.
  • 데이터요소와 요소는 쉼표로 구분한다.
sandwich = ['peanut butter', 'jelly', 'bread']

1) 다차원 List

list 안의 list

[["Bulls", 23], ["White Sox", 45]]



II. List의 Index

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


1. 수정이 가능한 List의 Index

기존 list

hobby = ['reading', 'running', 'swimming']

Index로 수정하기

hobby[0] = 'walking'

hobby = ['walking', 'running', 'swimming']


2. 다차원 List에서의 Index

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
  • list 안의 list요소를 호출하고 싶다면 index를 두번 써야 한다!
    (list 안의 list 안의 list = Index 3번)



III. List 요소 수정하기


1. 추가하기

1) .append() 메소드

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]];

2) 복수의 element 추가하기

추가하고자 하는 element가 한개 이상일때 + 를 사용할 수 있다.
+를 이용해 element들을 추가할때는 대괄호[]를 사용해 리스트의 형태로 만든 후 추가해야 한다.

즉, +는 list를 합쳐준다
또한 +를 사용해 list를 합한 값을 다시 저장하고자 하는 변수에 저장해 주어야 한다.

list1 = list1 + list2

3) insert 사용하기

insert를 사용해 원하는 위치에 element를 삽입할 수 있다.

따라서 insert를 사용할 때에는 추가하고자 하는 element는 물론, 추가하고자 하는 위치(Index)도 지정해주어야 한다.

함수이름.insert(추가하려는index위치, 추가할 element)


2. 제거하기


1) .pop() 메소드

pop()메소드를 사용해 List의 뒤에서부터 요소를 제거할 수 있다.

list.pop()

다중 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];

2) del 키워드 사용하기

del 키워드를 사용해 지정한 위치(Index)의 요소를 제거할 수 있다.

del 함수이름[제거할 요소의 위치]

3) remove() 메소드 사용하기

위의 del 키워드와 달리 index 정보가 필요하지 않는 remove 메소드가 있다. 이는 제거하고자 하는 element를 입력한다

함수이름.remove(제거하고자 하는 element)



Ⅳ. List Slicing

"python"에서 리스트 일부분을 따로 copy 하는 것

"Slice" in Pizza = 한조각!!!


1. Slicing 구조


1) start : stop

list_name[start : stop]

list_name의 element들 중에서 index[start] 부터 index[stop -1] 까지의 element들 copy 해서 가져온다.

2) start : stop : step

list_name[start : stop : step]

Step : 해당하는 값 만큼 건너뛰어 가져온다
index[start] 부터 index[stop-1] 까지, [step]간격으로 값을 가져온다.

3) start 생략

list_name[:stop]

해당 list의 첫 요소부터 stop-1번째 까지 가져온다.

4) stop 생략

list_name[start:]

해당 list의 index[start]부터 끝까지 가져온다.



2. Slicing 을 한다는 것은?

오리지널 list를 수정하는 것이 아니라, 새로운 list를 만들어 내는 것이다.

list=[1, 2, 3, 4, 5]
sub_list=list[1:4]

print(f'{sub_list}')
->
[2, 3, 4]



Ⅴ. List 여러 문제 풀어보기

1 임의의 list에서 첫번째와 마지막의 합 호출하기

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])

2 list1 + list2 후, 제일 앞과 제일뒤의 요소 서로 바꿔서 출력시키기.

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"]


3. 숫자로 구성된 list에서 홀수만 제거하기

1) 정답 코드

def remove_odd_numbers(numbers):
  for number in numbers[:]:
    if number%2 != 0 :
      numbers.remove(number)
  return numbers

2) 푼 과정

#1 : Fail!

처음에 짰던 코드는 다음과 같다.

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가 사라지지 않는건지..
(이 단계에서 숫자 하나하나 대입하며 풀어봤다면 스스로 원인을 알았을 수도 있을것 같다! 안해서 문제다)

#2 : Why?

나와 같은 문제에서 헤매는 사람들이 많았다. 여러사람들의 조언을 보니 remove()메소드로 인해 오리지널 list의 값이 for문이 진행되는 동안 계속 변했기 때문이라고 한다.
그렇다면 홀수인 요소는 제거하되 오리지널 list는 변화시키지 않는방법을 찾아야 한다.

#3 : Done!

바로 직전에 공부했던 개념중에 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





#40. Tuple

list와 같은 Data structure(자료 구조)


I. Tuple 기초

list는 수정이 가능하지만 tuple은 한번 선언되면 수정이 불가능하다!!


1. Tuple의 구조

일반괄호 () 를 사용한다

my_tuple = (1, 2, 3)

2. Tuple 사용법

앞서 말했듯 수정은 불가하다.
단, 읽는 방법(Index 사용), slicing 방법은 list와 같다.



II. Tuple을 사용하는 이유

list와 거진 비슷하면서 (수정이 안된다는 것 제외) 굳이 tuple을 따로 사용하는 이유는??


list가 tuple보다 차지하는 메모리 용량이 더 크다.

  • list는 수정이 가능하고 여러 수의 요소들을 저장할 수 있기 때문
  • 더 많은 기능과 flexibility를 제공하기 때문

따라서 수정이 필요없고 간단한 형태의 데이터를 표현할 땐 tuple이 훨씬 더 효과적이다.

1. tuple을 사용할 때 예시

  1. 2~5개 사이의 요소를 저장할 때 사용 (ex) 좌표의 위치 요소 4개정도)
  2. 특정 데이터를 ad hoc(즉석적으로) 포현하고 싶을 때 사용


III. Tuple 문제 풀어보기


append가 안되는 tuple..


1. 6개 요소를 가진 list를 tuple로 바꿔 list 속으로 넣기.

1) 오답

처음에 모든 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 가 안되 이걸 어떻게하나.. 하고 막막했는데 앗차! 문제를 잘못봤구나!^__^ 난이도가 쑤욱 내려갔다.

2) 정답

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)]

+) Tuple 합치기

참고 자료 : https://yeolco.tistory.com/84 [열코의 프로그래밍 일기]
여러개의 튜플을 합쳐 표현하는 법을 찾았다!!!!!!!

#1 합치기

tuple1 = (1, 2)
tuple2 = ("hi", "bye")
tuple3 = tuple1 + tuple2
print(tuple3) # (1, 2, 'hi', 'bye') 출력

#2 중첩하기

tuple1 = (1, 2)
tuple2 = ("hi", "bye")
tuple3 = (tuple1 , tuple2)
print(tuple3) # ((1, 2), ('hi', 'bye')) 출력





#41. Set



I. set 기초

list와 친척사이
list와 마찬가지고 여러 다양한 타입의 element들을 저장할 수 있다.
But, 차이점이 존재한다.

  • list와 달리 요소들이 순서대로 저장되지 않는다. (original이 없다) 그러므로 for문에서 읽어들일때 요소들이 순서대로 나오지 않고 무작위 순서대로 나온다.
  • 순서가 없으므로 indexing도 없다. 특정 위치의 요소를 읽어들일 수 없다.
  • 동일한 값을 가지고 있는 요소가 1개 이상 존재할 수 없다. (중복된 값을 저장할 수 없다). / 새로 저장하려는 요소와 동일한 값의 요소가 존재한다면, 새로운 요소가 이 전 요소를 대치한다.
set1 = {1, 2, 3, 1}
print(set1)
-> {1, 2, 3}

1. set 생성법

  1. 중괄호 {} 사용하기
  2. set() 함수 사용하기.

1) 중괄호 {} 사용

set1 = {1, 2, 3}

2) set() 함수 사용

이 방법을 사용할 때에는 list를 parameter로 전달해야 한다.

set2 = set([1, 2, 3])

이런 특성때문에 set() 함수는 list를 set으로 변환하고 싶을 때 사용한다.


II. Set 수정하기

1. 새 요소 추가하기 : .add() 함수

set은 요소들이 순차적으로 저장되지 않기 때문에 append방법은 어울리지 않는다. 따라서 set에 새 요소를 추가할때에는 add 라는 함수를 사용한다.

my_set = {1, 2, 3}
my_set.add(4)
print(my_set)
-> {1, 2, 3, 4}

2. 요소 제거하기 : .remove() 함수

index의 의미가 없기 때문에 값을 지정하여 삭제하는 remove 함수를 사용한다.


3. 내부 요소 찾기

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

III. set의 사용처 : 교집합 / 합집합

set은 교집합과 합집할을 구할 때 사용될 수 있다.
교집합 = Intersection
합집합 = Union


1. 교집합 사용하기

  1. & 키워드 사용
  2. intersectino 함수 사용
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}

2. 합집합 구하기

  1. | 키워드 사용
  2. union 함수 사용
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}




#42 : Dictionary 딕셔너리

얘도 자료구조!!

I. Dictionary 기초


1. 기본 구조

my_dic = {"key1" : "value1", "key2" ; "value2"}
  • 중괄호 {}를 이용해 선언하기.
  • key와 value의 조합으로 이뤄진것 확인하자! ( 조합 순서 => key : value)
  • 각각의 key : value는 콤마(,)로 구분한다.

2. dictionary 요소 읽어들이기 : key값 사용하기

  • list 에서는 index를 사용했다.
  • dictionary는 key 값을 사용한다.

1) key는 string, 숫자 모두 가능하다.

2) key값은 중복될 수 없다!

만약 key값이 중복된다면, 이후의 key에 대한 value가 기존의 것을 대치한다.

dict1 = {1 : "one", 1 : "two"}
print(dict1)
-> {1 : "two"}

II. Dictionary 수정하기


1. 새 element 추가하기

딕셔너리이름[새로운key이름] = 새로운value이름

2. value값 치환하기

dict = {1 : "one", 2 : "two"}
dict[1] = "hello"
print(dict)
->
{1 : "hello", 2 : "two"}

3. 요소 삭제하기

key 값을 사용한다!

del 딕셔너리이름[삭제하려는key값]



III. dictionary 문제 풀기


1. 방탄 지민에 대한 정보 dictionary로 구성해 출력하기

1) 제출 코드 (Success!)

Jimin = {"가명" : "지민(Jimin)", "본명" : "박지민", "생년월일" : "1995.10.13", "출생지" : "부산", "포지션" : "리드래퍼와 메인댄서", "학력" : "글로벌사이버대학교"}

for key in Jimin:
  print(f'{key} : {Jimin[key]}')

2) 출력 화면

가명 : 지민(Jimin)
본명 : 박지민
생년월일 : 1995.10.13
출생지 : 부산
포지션 : 리드래퍼와 메인댄서
학력 : 글로벌사이버대학교
profile
🍎 🍊 🍋 🍏 🍇

0개의 댓글