21.2.18

커피 내리는 그냥 사람·2021년 2월 18일
0

위코드 pre코스

목록 보기
8/28

<파이썬 어려웠던 개념 정리 : list ~ Dictionary(29~42)>

  1. 리스트
  • list 만들기 방법은
    a = list()
    a= [~~~]
    가 있다.

  • 리스트는 여러 클래스를 넣을 수 있으며 순서가 있다.

  • 문제 중 에러 :
TypeError: make_list() takes 0 positional arguments but 2 were given

함수가 주어졌고 이미 테스트 케이스에서 2개의 인자를 받자고 나왔는데 본 함수가 0개의 인자를 받은 상황이다. 그래서 2개의 인자를 받아야 한다. 코드 작성 칸이 문제 파트였지만 실제로 리스트를 만들었을 때 실행되지 않는 에러는 함수 자체에 있어서 수정했다. 이후 하드 코딩, 즉 그 결과 값만 나오는 것이 아니라 원하는 것이 실제 아무거나 넣어도 되는 코딩이므로 이와 같이 수정해준다.

def make_list(a, b): # 수정 부분
  my_list = [a, b] # 문제 부분
  return my_list

이후 프린트 해주면 2줄이 나오는데 이유는

test.py에서 테스트 케이스가 한 줄 먼저 출력된다.
main.py에서 print한 내용이 한 줄 더 출력된다.

이는 파이썬의 특징적인 부분이라고 한다.

  1. 2차원 이상의 리스트 : 다차원 리스트
  • 고민했던 것 : 똑같이 하드코딩을 하지 않기 위해서 인자를 받는지 안 받는지 확인해본 결과 이번 문제는 인자를 안 받는 문제였다.
  • 해결 : 그냥 하드 코딩하기.(결과가 그대로 출력되게.)
  • 왜? : 함수를 그대로 인자 없이 호출해야 결과가 나오는 구조였기 때문.
    위 문제와 차이점
lass UnitTests(unittest.TestCase):
    def test_return_nested_lists(self):
        self.assertEqual(multi_list(), [['becoming', 29],['developers', 30]])

테스트 케이스 자체에 인자가 없다.

  1. 멀티 리스트 요소 접근 법 : 리스트를 순서대로 접근한다.
def access_list():
    # 아래의 코드는 변경하지 마세요. 
    my_list = [[1,2,3], [4,5,6], [7,8,9], [[10,11,12], 13, 14]];

    # 아래의 코드만 변경해 주세요.
    my_data = my_list[2][1]; # 8
  1. 문제 : 함수 완성하여 리스트 첫 값과 마지막 값 합 구하기
  • 고민한 것 : IndexError: list index out of range 에러.
    즉 인덱스의 마지막 값이 자꾸 레인지를 벗어난다. 분명 -1을 해줬는데도 그런다.
  • 해결 방법 : 마지막 인덱스는 -1이다. 굳이 len값을 지정하지 않아도 되었다. 전에도 비슷한 고민을 해봤다.
def add_first_and_last_elements(my_list):
  # 이 함수를 구현해주세요
  if len(my_list) > 1:
    return my_list[0] + my_list[-1] #마지막 요소
  elif len(my_list) == 1:
    return my_list[0]
  else:
    return 0

my_list = [0]
print(add_first_and_last_elements(my_list))

참고 블로그

  1. 리스트 두 개를 합한 뒤 0, -1 인덱스 위치 바꾸기
  • 고민 : 컴퓨터는 시키는 그대로 한다. 0과 -1의 위치를 바꾸려고 시도하면 0이 앞뒤로 생기거나 -1이 앞뒤로 생긴다.
  • 해결하려는 노력 :
    먼저 있는 그대로 해봤다. 실패. 앞 뒤로 1, 1 혹은 7, 7이 나온다.

그 다음으로 생각한 것 : 0을 뒤로 옮긴 뒤 -2가 된 요소를 앞으로 옮긴다.

def merge_and_swap(list1, list2):
 merge_list = list1+list2
 merge_list.insert(-1, merge_list[0])
 del merge_list[0]
 merge_list.insert(0, merge_list[-2])
 del merge_list[-2]
 return merge_list
  # 이 함수를 구현해 주세요


merge_and_swap([1,2,3], [5])

분명 요소는 바뀌었지만(1 2 3 4 5 6 7 -> 7 2 3 4 5 6 1) 테스트 코드에서 막혔다. 실패.

마지막 시도 : 파이썬 리스트 간단히 스왑 하기. 간단하게 인덱스 값으로 머지된 리스트를 바꾼다.
즉 a, b = b, a

def merge_and_swap(list1, list2):
 
 merge = list1+list2
 if merge == []: #빈 리스트 그대로 리턴
   return []
 merge[0], merge[-1] = merge[-1], merge[0]
 return merge
  # 이 함수를 구현해 주세요


merge_and_swap([1,2,3], [5])
  1. 리스트 슬라이싱 : 리스트의 일부를 복사하는 것(즉 새로운 것을 만드는 것).
    일부분에서도 그 건너뛰는 값을 만들 수 있다.

  2. 리스트 remove, del

  • 문제에서 고민한 것 : 홀수 요소만 지운다. 인덱스 번호가 아니라 홀수 자체를 지운다.
  • 시도해본 것 : for 반복문. 하지만 요소 갯수가 정해져 있다는 것에서 착안하여 다른 내용 도전
  • 성공한 것 :
def remove_odd_numbers(numbers):
  ## 이 함수를 구현해주세요
  if numbers[4] % 2 == 1:
    numbers.remove(numbers[4])
  if numbers[3] % 2 == 1:
    numbers.remove(numbers[3])    
  if numbers[2] % 2 == 1:
    numbers.remove(numbers[2])    
  if numbers[1] % 2 == 1:
    numbers.remove(numbers[1])
  if numbers[0] % 2 == 1:
    numbers.remove(numbers[0])        
  return numbers
  • 왜 숫자가 역순인가? : 혹시라도 하나라도 인덱스 요소가 지워지면 요소의 갯수가 바뀌어서 out of range가 되어버린다. - 선배 기수 블로그 통해 힌트 얻었다.
  1. tuple

    언제 쓰는가? : Tuple은 일반적으로 2개에서 5개 사이의 요소들을 저장할때 사용되며, 특정 데이터를 ad hoc(즉석적으로) 하게 표현하고 싶을때 사용. 튜플은 간단한 데이터를 사용할 때 가볍게 쓸 수 있다고 함.

  • 문제 : 리스트를 리스트 안에 튜플로 바꾸기
  • 고민한 것 : 리스트 슬라이싱 부분 + return
  • 해결 : 계산 자세히 하여 해결
def convert_list_to_list_of_tuples(my_list):
  ## 이 함수를 구현해 주세요
  new_list = [tuple(my_list[0:2]), tuple(my_list[2:4]),tuple(my_list[4:6])]
  return new_list
  1. set : 순서가 없다. 동일한 인덱스 요소가 없다.
  • 세트 만들기
set1 = {1, 2, 3}
set2 = set([1, 2, 3])
  • 요소 추가는 add를 이용한다.(append는 순서가 있는 것이라 안 쓴다.)

<checkpoint : Dictionary 공부하기>
1. 딕셔너리 요소 수정하기

my_dict = { "one": 1, 2: "two", 3 : "three" }
my_dict["four"] = 4 # list와 유사
print(my_dict)
> {'one': 1, 2: 'two', 3: 'three', 'four': 4}
  1. 과제1
지민 = {"가명" : "지민", "본명" : "박지민", "생년월일" : "1995년 10월 13일", "출생지" : "부산", "포지션" : "리드 보컬, 메인 댄서", "학력" : "한양사이버대학교 재학"}
  1. 과제2
  • Set 과 Dictionary 의 차이

    Dict는 요소의 인덱스라는 것이 존재하지만 set은 인덱스, 즉 순서가 존재하지 않는다. 또한 dict는 키/값 쌍으로 이뤄져 있지만 set은 값만 있다.

  • List 와 Tuple 의 차이
    리스트와 튜플은 인덱스 요소가 있다는 점 등 유사해 보이지만 튜플은 추후 수정이 어렵다는 점과 그 용도가 다르다는 점이 있다.(8번 튜플 설명 참고)
profile
커피 내리고 향 맡는거 좋아해요. 이것 저것 공부합니다.

0개의 댓글