Python TIL(3) - 리스트 & 튜플

random·2021년 3월 21일
0

Python - TIL

목록 보기
3/19

1. 리스트, 튜플 공부기록

필수 개념, 간단한 예시 프로그램을 이용한 공부

  • 시퀀스: 모든 시퀀스 타입(str, list, etc)은 iterable 타입이다. 하지만 반대로 모든 interable 타입이 시퀀스인것은 아니다. 예시; dictionary 타입을 for문으로 루핑이 가능하지만 시퀀스는 아님!
  • 시퀀스는 ordered item의 모음이다. ordered 되었다는 것은 index position이 부여됨을 의미함.
  • string은 immutable 하기 때문에, 변경을 시도하면 새로운 id를 지닌 객체를 생성한다. list는 mutable이기 때문에 새로 객체를 생성하는 것 없이 동일한 객체의 item값을 변경함.

<리스트, 튜플 실습: 쇼핑 리스트>


available_parts = ["computer", "monitor", "keyboard", 
                   "mouse", "mouse mat", "hdmi cable"
                   ]

current_choice = "-"
computer_parts = [] #create an empty list

while current_choice != '0':
    if current_choice in '1 or 2 or 3 or 4 or 5 or 6':
        print("adding {}".format(current_choice))
        if current_choice == '1': 
            computer_parts.append("computer")
            print(computer_parts)
        elif current_choice == '2': 
            computer_parts.append("monitor")
            print(computer_parts)
        elif current_choice == '3': 
            computer_parts.append("keyboard")
            print(computer_parts)
        elif current_choice == '4': 
            computer_parts.append("mouse")
            print(computer_parts)
        elif current_choice == '5': 
            computer_parts.append("mouse mat")
        elif current_choice == '6': 
            computer_parts.append("hdmi cable")
        
    else:  #(1안)   
        print("please add options from the list below: ")
        for part in available_parts:  
            print("{0}: {1}".format(available_parts.index(part) + 1, part))

    else:  #(2안) 
        print("please add options from the list below: ")
        for number, part in enumerate(available_parts): 
            print("{0}: {1}".format(number + 1, part))

    current_choice = input()

print(computer_parts)
  • current choice와 while의 조건이 서로 다름을 '참 True'으로 설정하여서 이하 While이 정상 루핑이 되도록 설정함.
  • 선택 가능한 모든 양의 정수 옵션인 (리스트 내 아이템 개수) 1~6에 각각 if 조건을 걸어주어서 선택 가능한 모든 경우의 수에 대비함.
  • print(computer_parts)를 통해서 새로 추가된 부품이 있을 때 마다 리스트에 추가하여 그 결과값을 출력하기. 실시간 정보기입 여부 파악 가능해짐.
  • else 문을 두가지 방법으로 표현 가능함 (1안, 2안) 시간 효율적인 측면에서 2안이 더 나은 선택임. 그 사유는, 만일 아이템 리스트가 굉장히 방대한 양이라고 가정할 시, 1안에서의 코드는 index 위치값과 item이 맞는지 각 아이템별로 일일이 다 확인을 하는 과정을 거침. 따라서 많은 시간이 소요될 것임.
    이에 반해 2안 enumerate 함수는 index 위치값과, 아이템을 자동으로 루핑하여 반환하는 함수이기 떄문에 (이것을 위해 특화된 함수이기 때문에) 시간이 덜 소모됨.
  • 문제점 발견: 만일 list 데이터 양이 무수히 많이 커지게 되면, 코딩 작성에 많은 애를 먹음.

<위 코드의 대안책>


available_parts = ["computer", "monitor", "keyboard", 
                   "mouse", "mouse mat", "hdmi cable",
                   "dvd drive"]

#valid_choices = [str(i) for i in range (1, len(available_parts) +1)]
valid_choices = []
for i in range(1, len(available_parts) + 1):
    valid_choices.append(str(i))
print(valid_choices)
current_choice = "-"
computer_parts = [] 
#create an empty list

while current_choice != '0':
    if current_choice in valid_choices:
        print("adding {}".format(current_choice))
        index = int(current_choice) - 1
        chosen_part = available_parts[index]
        computer_parts.append(chosen_part)
        print(computer_parts)

    else:
        print("please add options from the list below: ")
        for part in available_parts:  
            print("{0}: {1}".format(available_parts.index(part) + 1, part))

    current_choice = input()
  • list의 index 기능을 활용한 개선책.
  • 내가 입력한 input 값(current_choice)을 index값(available_parts[index])으로 활용하여 빈 리스트에 선택된 해당 index 값을 갖는 아이템을 추가하는 방법.
  • 첫 번째로 소개한 코드 대비 많은 부분에서 자동화를 이룸. 고로, 더 효과적인 코드임.
  • 새로 알게된 점: input 함수는 str을 반환한다! 늘 유념할 것.

향후 더 생각해볼 거리: 만일 리스트 데이터가 중복된다면 새로 리스트에 추가되는 것을 막고, 그에 대한 메세지("해당 아이템을 이미 고르셨습니다") 전송해주기. 추후 시간이 되면 꼭 추가해볼 기능!


2. 리스트 Sort 기능 학습

리스트 에서 자주 사용되는 Sort를 공부해보자

  • 모든 iterables는 sort 가 가능하다!

even = [2, 4, 6, 8]
odd = [1, 3, 5, 7 ,9]

even.extend(odd)
print(even)

another_even = even
print(another_even)

even.sort()
print(even)

even.sort(reverse=True)
print(id(even))
print(id(another_even))

-sort와 reverse sort 사용법: sort는 새로운 리스트를 복사하거나 만드는 것이 아니고 본리스트를 mutate해서 재정렬하는 것임.


love = "We are the world. We are the children. We are the ones who make the better place."


letter = sorted(love)
print(letter)

numbers = [2.3, 4.5, 8.7, 3.1, 9.2, 1.6]
sorted_numbers = sorted(numbers)
print(sorted_numbers)

another_sorted_numbers = numbers.sort()
print(numbers)
print(another_sorted_numbers)

윗 코드 결과값:
1. [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '.', '.', '.', 'W', 'W', 'W', 'a', 'a', 'a', 'a', 'a', 'b', 'c', 'c', 'd', 'd', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'h', 'h', 'h', 'h', 'h', 'h', 'i', 'k', 'l', 'l', 'l', 'm', 'n', 'n', 'o', 'o', 'o', 'p', 'r', 'r', 'r', 'r', 'r', 'r', 's', 't', 't', 't', 't', 't', 't', 'w', 'w']
2. [1.6, 2.3, 3.1, 4.5, 8.7, 9.2]
3. [1.6, 2.3, 3.1, 4.5, 8.7, 9.2]
4. None

1: sorted(love)를 통해서 sorted 함수는 특수기호, 대문자, 소문자 알파벳 순으로 정렬한다는 것을 확인함
2: sorted(numbers)를 통해서 해당 리스트를 오름차순 정렬후 출력함.
3: 해당 리스트를 numbers.sort() (행동 메소드)를 통해서 재정렬한 후 출력함.
4: 2번과 3번의 차이점은; sorted(numbers)와 numbers.sort()의 차이점은; 전자는 (numbers)라는 인자값을 넣어줘서 print시 리턴값이 있지만 후자는 sort() 안에 아무 인자값이 없어서 print시 none 값이 나오게됨. 후자는 그저 주어진 행위(정렬하기)만 했음을 의미함.

  • sort와 sorted 메소드의 차이: 전자는 본리스트에 변형을 가해서 원래 리스트를 바꾸는건데, sorted는 새로운 리스트 객체를 생성하고 리턴함. 따라서 서로 id값이 다름.

0개의 댓글