파이썬에서 반복문에 사용되는 객체를 이터러블하다라고 하며,
반복되는 객체로 리스트, 튜플, 딕셔너리, 세트, range 등 여러개가 있다.
이 객체들을 시퀀스 객체라고도 한다.
>>> 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>
>>> 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의 경우 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, 색인) 위치값을 뜻함. 시퀀스 객체에
[](대괄호)
를 붙여 사용.
- 시퀀스 객체의 인덱스는 항상 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]
len()
함수로 전체 길이를 구한 뒤 나온 숫자에 -1을 대입하여 마지막 인덱스 번호를 구한다.a = [0, 10, 20, 30, 40, 50]
print(a[-2]) # -1부터 시작하므로 결과는 40이 나온다.
#실행결과
40
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
파이썬은 리스트에 자료형을 혼합해 사용 가능, 다른 언어는 문자만 가능.
>>>shopping_list = ['milik', 'eggs', 'cheese', 'butter', 'cream']
>>> 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()는 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]
>>> shopping_list = ['milik', 'eggs', 'cheese', 'butter', 'cream']
>>> b = shopping_list
>>> b.reverse() #list가 담긴 변수에 메서드를 사용함.
>>> print(b)
['cream', 'butter', 'cheese', 'eggs', 'milik']
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'?
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)]
- 입력값을 하나씩 가져오기 위해 str타입으로 변환 후 list에 담아 for문을 돌리고 가져 온 값을 다시 int로 변환하여 list comprehension에 담아둔다.
- 반복문이 끝나면 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
>>> a = [10, 20, 30]
>>> a.append(500)
>>> a
[10, 20, 30, 500]
>>> len(a)
4
>>> a = [10, 20, 30]
>>> a.append([500, 600])
>>> a
[10, 20, 30, [500, 600]]
>>> len(a)
4
>>> squares.insert(2, 111)
>>> squares
[0, 1, 111, 4, 10, 20, 30, 49]
>>> 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]
heroes = ['스파이더맨', '헐크', '아이언맨', '배트맨', '슈퍼맨', '원더우먼']
heroes.pop(1)
'헐크'
heroes
['스파이더맨', '아이언맨', '배트맨', '슈퍼맨', '원더우먼']
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
리스트의 복사는 복사가 아니다.
리스트 복사 시 원본의 변경 사항을 파악하고 해야한다.
list3과 list1이 같지만 메모리에 저장된 값의 주소를 똑같이 맞춰 줄 뿐이다.
따라서 메모리에 값이 복사되는 건 아님.
>>> list1 = [1, 2, 3, 3]
>>> list3 = list1
>>> list3
[1, 2, 3, 3] #list1의 주소가 복사될 뿐.
리스트 함수를 사용하여 새로운 리스트를 만들어주므로 메모리에 복사가 됨.
>>> 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]
>>> 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]
Tuple은 immutable, 즉 변경이 불가한 값이다. 한번 정의 내리면 그걸로 끝이다.
앞서 말했다 싶이 변경이 불가하다. 따라서 추가, 변경, 삭제는 물론 허용되지 않는다.
다만 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
#변수와 같음, 괄호 없음.
>>>t = (10)
10
#튜플 형식은 소괄호가 있음.
>>>t = (10, )
(10,)
>>> 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)