PY | Iterable, Index, List, Tuple

Stellar·2021년 5월 16일
0

Python

목록 보기
8/36
post-thumbnail

Iterable이란

파이썬에서 반복문에 사용되는 객체를 이터러블하다라고 하며,
반복되는 객체로 리스트, 튜플, 딕셔너리, 세트, range 등 여러개가 있다.
이 객체들을 시퀀스 객체라고도 한다.

✔️ iter(), 객체가 반복되는 객체라 반복문에 사용이 가능한지 알 수 있다.

>>> list = [1, 2, 3]
>>> a = 1

#불가능. 에러.
>>> print(iter(a))
Traceback (most recent call last):
  File "<pyshell#59>", line 1, in <module>
    print(iter(a))
TypeError: 'int' object is not iterable

#가능
>>> print(iter(list))
<list_iterator object at 0x103725420>

✔️ in을 사용하여 값의 유무 확인. 이터러블 함수에 모두 통용됨.

>>> if 'kim' in contacts :
           print('yes')
yes

>>> 'Korean' in scores
True
>>> 'Reading' in scores
False

swap 기능만 참고하기
https://velog.io/@meekukin/Python-Changing-elements-%EC%98%88%EC%A0%9C


List와 Tuple의 차이점

  • List와 Tuple은 요소를 저장할때 쓰이지만 List는 수정이 가능하고, Tuple은 한번 선언되면 수정이 불가능하다.

  • List는 대괄호[]를 사용하지만 Tuple은 소괄호()를 사용한다.

  • 요소를 읽어들이는 방법과 슬라이싱 방법은 모두 List와 동일하다.

  • Tuple의 경우 2개 ~ 5개 사이의 요소들을 저장할때 사용되며, 특정 데이터를 즉석적으로 표현하고 싶을때 사용된다. ex) 좌표 표시

  • Tuple은 수정이 불가능한 만큼 용량이 적어 수정이 필요없고 간단한 형태의 데이터를 표현할때 사용하면 효과적이다.

# List 좌표 표시 예시 (리스트도 좌표를 표현할 수 있지만 비효율적)
coords = [ [4,4],  [5,2],  [-2, 2],  [-3, -4] ]
======================================================
# Tuple 좌표 표시 예시
coords = [ (4,4),  (5,2),  (-2, 2),  (-3, -4) ] # 소괄호() 사용

✔️ 변수에 대입 연산자 사용하기

파이썬에서만 사용 가능한 기능.
리스트와 튜플에 사용 가능.

>>> student1 = ('철수', 19, 'CS') #철수는 튜플
>>> student2 = ['유리', 15, 'PS'] #유리는 리스트
>>> name, age, major = student1
>>> name
'철수'
>>> age
19
>>> major
'CS'
>>> name, age, major = student2
>>> name
'유리'
>>> age
15
>>> major
'PS'

인덱스(Index)란

인덱스(index, 색인) 위치값을 뜻함. 시퀀스 객체[](대괄호)를 붙여 사용.

  • 시퀀스 객체의 인덱스는 항상 0부터 시작
  • list, tuple, range, 문자열 사용가능
  • 시퀀스객체[인덱스]
a = [0, 10, 20, 30, 40, 50]
print(a[3]) # 0부터 시작하므로 결과는 30이 나온다.

#실행결과
30

인덱스를 지정하지 않으면 해당 객체 전체를 뜻하여 전체가 출력됨.

a = [0, 10, 20, 30, 40, 50]
print(a) # 인덱스 지정하지 않음.

#실행결과
[0, 10, 20, 30, 40, 50]

음수 인덱스

  • 인덱스를 음수로 지정하면 뒤에서부터 요소에 접근하게되어 -1은 뒤에서 첫 번째, -5는 뒤에서 다섯 번째 요소를 뜻한다.
  • list, tuple, range, 문자열 사용가능
  • 값이 수만가지일 때 마지막 요소에 바로 접근하기
    len()함수로 전체 길이를 구한 뒤 나온 숫자에 -1을 대입하여 마지막 인덱스 번호를 구한다.
a = [0, 10, 20, 30, 40, 50]
print(a[-2]) # -1부터 시작하므로 결과는 40이 나온다.

#실행결과
40

인덱스 범위를 벗어난 경우 IndexError 발생

a = [0, 10, 20, 30, 40, 50]
print(a[6]) # 인덱스 범위 벗어남

#실행결과
Traceback (most recent call last):
  File "C:\project\practice_arithmetic.py", line 2, in <module>
    print(a[6])
IndexError: list index out of range

❓ 질문

  • 파이썬 인덱싱 왜 헷갈리게 [1:3] 일때 3 앞에꺼만 나옴?

list [ ]

파이썬은 리스트에 자료형을 혼합해 사용 가능, 다른 언어는 문자만 가능.

리스트 정의하기

>>>shopping_list = ['milik', 'eggs', 'cheese', 'butter', 'cream']

✔️ 불러오기 인덱스는 0부터 시작.

>>> shopping_list = ['milik', 'eggs', 'cheese', 'butter', 'cream']
>>> print(shopping_list)
['milik', 'eggs', 'cheese', 'butter', 'cream']
>>> print(shopping_list[0]) #0부터 시작
milik

✔️ 인덱스로 변경하기.

>>> shopping_list[2] = "apple" #인덱스 지정 값 변경
>>> print(shopping_list)
['milik', 'eggs', 'apple', 'butter', 'cream']

✔️ 내장 리스트

내장된 리스트의 값을 가져오기 위해 인덱스를 두번 사용하면 된다.

>>> a = [[1,2,3],[4,5,6]]
>>> a[0]
[1, 2, 3]
>>> a[0][1]
2

✔️ 중첩리스트

>>> a = [1,2,3[4,5,6[7,8,9]]]

✔️ 리스트 순서 뒤집기 reverse() VS reversed()

reverse() VS reversed() 차이점

reverse()는 list 함수의 메서드다. 저장된 변수가 변경되어 주의.
reversed()의 경우 내장함수다. 임시로 순서가 뒤집혀 원본은 유지.

>>> i = [1, 2, 3, 4, 5]

#reverse() 원본 변경.
>>> print(i.reverse())
None
>>> i
[5, 4, 3, 2, 1]

#reversed() 임시 변경, 원본 유지.
>>> print(list(reversed(i)))
[5, 4, 3, 2, 1]
>>> i
[1, 2, 3, 4, 5]

#sorted() 사용, 임시 변경, 원본 유지.
>>> print(sorted(i, reverse=True))
[5, 4, 3, 2, 1]
>>> i
[1, 2, 3, 4, 5]

reverse(), reversed() 예시

  • reverse()
>>> shopping_list = ['milik', 'eggs', 'cheese', 'butter', 'cream']
>>> b = shopping_list
>>> b.reverse() #list가 담긴 변수에 메서드를 사용함.
>>> print(b)
['cream', 'butter', 'cheese', 'eggs', 'milik']
  • reversed()

    reversed 메소드는 비교 연산자를 사용할 수 없다.
    '>' not supported between instances of 'reversed' and 'reversed'

#함수로 사용가능.
>>> shopping_list = ['cream', 'butter', 'cheese', 'eggs', 'milik']
>>> print(list(reversed(shopping_list))) 
['milik', 'eggs', 'cheese', 'butter', 'cream']

#메서드로는 사용 불가.
>>> c = shopping_list
>>> print(c)
['cream', 'butter', 'cheese', 'eggs', 'milik']
>>> c.reversed() 
Traceback (most recent call last):
  File "<pyshell#32>", line 1, in <module>
    c.reversed()
AttributeError: 'list' object has no attribute 'reversed'. Did you mean: 'reverse'?

✔️ 리스트 원소 개수 세기 Counter()모듈

from collections import Counter

my_list  = ['Tick', 'Tock', 'Tock'] # 나의 리스트
new_list = ['Tick', 'Tock', 'Song'] # 추가로 나타난 리스트

# 나의 리스트를 센다
counter = Counter(my_list)
print(counter)

# 추가된 리스트를 누적하여 센다
counter.update(new_list)
print(counter)

# 가장 많이 나타난 2개를 출력한다
print(counter.most_common(n=2)) # n으로 원하는 수의 값을 가져옴

# 출력
Counter({'Tock': 2, 'Tick': 1})
Counter({'Tock': 3, 'Tick': 2, 'Song': 1})
[('Tock', 3), ('Tick', 2)]

✔️ list comprehension

입력값 12345를 합하여 출력 sum

  1. 입력값을 하나씩 가져오기 위해 str타입으로 변환 후 list에 담아 for문을 돌리고 가져 온 값을 다시 int로 변환하여 list comprehension에 담아둔다.
  2. 반복문이 끝나면 sum() 함수를 사용해 리스트에 담긴 모든 값을 합하여 반환한다.
def solution(n):
    # return sum([int(i) for i in list(str(n))])
    # 입력값을 반복문에 넣기 전 list에 담지 않아도 str 타입이면 하나씩 가져온다.
    return sum([int(i) for i in str(n)])
    
print(solution(12345))

리스트 컴프리헨션으로 단어의 첫 글자만 뽑아내기

>>> list1 = ['all', 'good', 'thicgs', 'must', 'come', 'to', 'an', 'end']
>>> items = [word[0] for word in list1]
>>> items
['a', 'g', 't', 'm', 'c', 't', 'a', 'e']

✔️ 인덱스 초과 시 나머지(%) 연산자로 무한대 만들기

배열의 길이를 나머지 연산하면 배열의 길이를 넘지 않는다.

# a 배열의 길이는 5
>>> a = len([1,2,3,4,5])
>>> 0 % a
0
>>> 4 % a
4
# a의 길이가 5이므로 5%5가 되어 나머지 값이 0이 되므로 0으로 리셋된다.
>>> 5 % a
0
>>> 6 % a
1
>>> 7 % a
2

✔️ 리스트에 값 추가하기

.append()

>>> a = [10, 20, 30]
>>> a.append(500)
>>> a
[10, 20, 30, 500]
>>> len(a)
4

.append(), 리스트안에 리스트

>>> a = [10, 20, 30]
>>> a.append([500, 600])
>>> a
[10, 20, 30, [500, 600]]
>>> len(a)
4

.insert(), 인덱스로 집어 넣기

>>> squares.insert(2, 111)
>>> squares
[0, 1, 111, 4, 10, 20, 30, 49]

참고. 코딩도장 | Unit 22. 리스트와 튜플 응용하기

✔️ 공백 리스트

>>> a = []
>>> a
[]
>>> a = list()
>>> a
[]
>>> a = list("hello")
>>> a
['h', 'e', 'l', 'l', 'o']
>>> a = list(range(0, 5))
>>> a
[0, 1, 2, 3, 4]

✔️ 리스트 슬라이싱

슬라이싱은 새로운 리스트를 반환 함.

>> squares = [0, 1, 4, 9, 16, 25, 36, 49]
>> squares[3:6] #인덱스 3부터 6 앞까지만 가져 옴.
[9, 16, 25]

✔️ 리스트 값 삭제

공백 리스트로 재정의

>>> squares[3:6] = []
>>> squares
[0, 1, 4, 36, 49]

pop(), 인덱스로 삭제

heroes = ['스파이더맨', '헐크', '아이언맨', '배트맨', '슈퍼맨', '원더우먼']
heroes.pop(1)
'헐크'
heroes
['스파이더맨', '아이언맨', '배트맨', '슈퍼맨', '원더우먼']

remove(), 값으로 삭제

heroes.remove('슈퍼맨')
heroes
['스파이더맨', '아이언맨', '배트맨', '원더우먼']

✔️ 리스트와 산술 연산자

#플러스
>>> marvel_heroes = ['스파이더맨', '헐크', '아이언맨']
>>> dc_heroes = ['배트맨', '슈퍼맨', '원더우먼']
>>> heroes = marvel_heroes + dc_heroes
>>> heroes
['스파이더맨', '헐크', '아이언맨', '배트맨', '슈퍼맨', '원더우먼']

#곱하기
>>> x = [1, 2, 3]
>>> x * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]

✔️ 리스트의 비교 연산자

'==' 내용이 전부 같아야 함.

#순서도 같아야 함.
>>> list1 = [1,2,3]
>>> list2 = [3,2,1]
>>> list1 == list2
False

<, > 리스트의 첫 숫자끼리 비교 후 같으면 다음 숫자끼리 비교 함.

>>> list1 = [1,2,3]
>>> list2 = [3,2,1]
>>> list1 > list2
False
>>> list1 < list2
True
>>> list1.insert(0, 3)
>>> list1
[3, 1, 2, 3]
>>> list1 < list2 #list1[1]값은 1, list2[1]값은 2니까 list2가 큼.
True

✔️ 리스트 내용으로 인덱스 넘버 찾기

>>> list1
[1, 2, 3, 3]
>>> list2
[3, 2, 1]
>>> list2.index(2)
1
>>> list1.index(3)
2

✔️ 얕은 복사, 깊은 복사

리스트의 복사는 복사가 아니다.
리스트 복사 시 원본의 변경 사항을 파악하고 해야한다.

shellow copy, 얕은 복사

list3과 list1이 같지만 메모리에 저장된 값의 주소를 똑같이 맞춰 줄 뿐이다.
따라서 메모리에 값이 복사되는 건 아님.

>>> list1 = [1, 2, 3, 3]
>>> list3 = list1
>>> list3
[1, 2, 3, 3] #list1의 주소가 복사될 뿐.

deep copy, 깊은 복사

리스트 함수를 사용하여 새로운 리스트를 만들어주므로 메모리에 복사가 됨.

>>> list4 = list(list1) 
>>> list4
[1, 2, 88, 3]
>>> list1[0] = 111
>>> list1
[111, 2, 88, 3]
>>> list3
[111, 2, 88, 3]
>>> list4
[1, 2, 88, 3]

deepcopy 함수 사용하기.

>>> from copy import deepcopy
>>> values = deepcopy(list1)
>>> values
[111, 2, 88, 3]
>>> list1[1] = 7777
>>> list1
[111, 7777, 88, 3]
>>> list3
[111, 7777, 88, 3]
>>> list4
[1, 2, 88, 3]
>>> values
[111, 2, 88, 3]

List of Tuples


Tuple ( )

Tuple은 immutable, 즉 변경이 불가한 값이다. 한번 정의 내리면 그걸로 끝이다.

✔️ tuple 값 추가, 변경, 삭제

앞서 말했다 싶이 변경이 불가하다. 따라서 추가, 변경, 삭제는 물론 허용되지 않는다.
다만 tuple을 list로 감싸 자료형을 바꾸거나,tuple을 새로 정의하면 된다. 이런 경우 id가 바뀌어 기존 tuple과 무관한 데이터가 되므로 원본 불변 법칙은 유지 된다.

tu = (1, 2, 3, 4)
tu2 = []
for i in tu :
    tu2.append(i)

print(tu, id(tu))
print(tu2, id(tu2))

========================= RESTART: /Users/boksilhwang/Documents/test.py =========================
(1, 2, 3, 4) 4341618128 #tuple
[1, 2, 3, 4] 4343380160 #list

✔️ tuple에 정수만 적을 경우 변수와 같다.

#변수와 같음, 괄호 없음.
>>>t = (10)
10
#튜플 형식은 소괄호가 있음.
>>>t = (10, )
(10,)

✔️ list를 변경하지 못 하게 tuple로 바꿀 수 있다.

>>> s = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]] #리스트 정의
>>> t = tuple(s)
>>> s
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]
>>> t
([1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15])
>>> t = tuple(s[0]) #인덱스 사용
>>> t
(1, 2, 3, 4, 5)

0개의 댓글