Python

파이썬(Python) tuple, list, dictionary,set 샘플코드 및 정리

■파이썬 리스트 타입의 자료형(List)

파이썬에서 리스트는 배열이라고 생각하면 됩니다.

a = []
b = [1,2,3,4,5]
c = ['Hello','World']
d = [1,2,3, ['Hello', 'World']]

[실행결과]

리스트의 값을 변경하는 방법은 인덱스를 지정하여 변경할 수 있습니다.

a = [1,2,3,4,5]
a[0] = 'aa'
print(a)

[실행결과]

['aa', 2, 3, 4, 5]

리스트의 일부값을 삭제하는 방법 : [ ]처리

a = [1,2,3,4,5]
a[3:4] =[]
print(a)

[실행결과]

[1, 2, 3, 5]

리스트의 값을 여러개 변경하는 방법

a = [1,2,3,4,5]
a[2:3] = ['a','b','c']
print(a)

[실행결과]

[1, 2, 'a', 'b', 'c', 4, 5]

리스트의 일부값을 삭제 하는 방법2 : del 키워드 사용

a = [1,2,3,4,5]
del a[1]
print(a)

[실행결과]

[1, 3, 4, 5]

■리스트 함수

함수설명
append(추가할 값)리스트에 값 추가
extend(확장할 리스트)리스트에 리스트를 추가
index(찾을 값)리스트에서 찾을 값의 위치를 반환
insert(추가할 위치, 추가할 값)리스트에 넣을 위치에 넣을 값을 넣어준다.
remove(삭제할 대상 값)리스트에서 삭제할 값을 찾아서 삭제 (가장 먼저 나온 값), 인덱스 번호 아님
count(찾을 값)리스트에 찾을 값이 몇 개있는지 개수를 세서 반환
sort()리스트 정렬 (  가나다 순으로 정렬 )
a = [1,2,3,4,5]
a.append(10)
a.append(6)
a.append(9)
print(a)

[실행결과]

[1, 2, 3, 4, 5, 10, 6, 9]

정렬시 리버스(reverse)로 정렬할 경우 reverse = True를 설정한다. 반드시 대문자 T로 시작하는 True로 설정해야한다.

#정렬하기
a.sort()
print (a)

#리버스 정렬
a.sort(reverse = True)
print (a)

[실행결과]

[1, 2, 3, 4, 5, 6, 9, 10]

[10, 9, 6, 5, 4, 3, 2, 1]

여러개의 리스트를 하나로 합치는 방법 : + 기호를 사용하여 간단하게 해결됩니다.

b = [1, 2, 3, 4, 5]
c = ['Hello', 'World']

a = b + c

print(a)

[실행결과]

[1, 2, 3, 4, 5, 'Hello', 'World']

■파이썬 리스트 값 중복 제거 하는 방법

set()함수를 사용하면 중복된 값이 제거 됩니다. 그러나 자료형이 set 자료형으로 변경됩니다. 그럼으로 중복 제거 후 리스트 자료형으로 형변환이 필요합니다. 

b = [1, 2, 3, 4, 5, 1, 2, 3]
c = ['Hello', 'World', 1, 2, 3]

a = b + c
print(a)

#중복제거
d = set(a)  #set 자료형
print(type(d))
print(d)

#다시 리스트 자료형으로 형변환
e = list(d)
print(type(e))
print(e)

[실행결과]

[1, 2, 3, 4, 5, 1, 2, 3, 'Hello', 'World', 1, 2, 3]
<class 'set'>
{1, 2, 3, 4, 5, 'Hello', 'World'}
<class 'list'>
[1, 2, 3, 4, 5, 'Hello', 'World']

■파이썬 리스트를 문자열로 변환하는 방법 (list to string)

리스트를 문자열로 변경하는 방법은 join()함수를 사용하여 처리할 수 있다. 주의해야할 점은 하나 있습니다. 리스트의 요소가 가 문자열이 아닌 정수일경우 join문에 바로 적용하면 TypeError: sequence item 0: expected str instance, int foud 오류가 발생됩니다.  join문 안에 for문을 사용하여 str()함수를 사용하여 형변환 처리를 해야합니다.  문자열로 변환시 구분자를 추가할 수도 있습니다.

a = [1, 2, 3, 4, 5]

str1 = ''.join(a)

#실행결과
TypeError: sequence item 0: expected str instance, int found


str2 = ''.join(str(e) for e in a)
print(str2)

#실행결과
12345


b = ['Hello', 'World', 'Python']
str3 = ''.join(a)
print(str3)

#실행결과
HelloWorldPython



b = ['Hello', 'World', 'Python']

#문자열 구분자로 공백을 준 경우
str3 = ' '.join(b)
print(str3)

#실행결과
Hello World Python

#문자열 구분자로 콤마를 준 경우
str3 = ','.join(a)
print(str3)

#실행결과
Hello,World,Python

■파이썬 리스트를 JSON으로 객체로 변환하는 방법(List to JSON)

JSON타입의 문자열이 필요할 경우가 아주 많아요. json모듈을 사용하면 쉽게 변환할 수 있어요. json.dumps()함수를 사용 예제를 살펴봅니니다. 딕셔너리 자료형 역시 JSON으로 동일하게 변환하시면 됩니다.

import json

alist = [{'a': 1, 'b': 2}, {'c': 3, 'd': 4}]
print(type(alist))

jsonstr = json.dumps(alist)
print(jsonstr)


#실행결과
<class 'list'>
[{"a": 1, "b": 2}, {"c": 3, "d": 4}]

이렇게 쉽게 JSON문자열로 변경이 가능해요. 그러나 한글을 사용할때는 한글깨짐 현상이 발생합니다. 한글 깨짐 현상을 해결하기 위해서는 dumps()함수를 사용시 인자값으로 ensure_ascii=False를 처리해주어야 한글이 깨짐을 방지할 수 있습니다.

import json

alist = [{'a': 1, 'b': 2}, {'c': '홍길동', 'd': 'Hello Python'}]

jsonstr = json.dumps(alist)
print(jsonstr)

# 실행결과 한글깨짐현상 발생
[{"a": 1, "b": 2}, {"c": "\ud64d\uae38\ub3d9", "d": "Hello Python"}]



jsonstr = json.dumps(alist, ensure_ascii=False)
print(jsonstr)

#실행결과
[{"a": 1, "b": 2}, {"c": "홍길동", "d": "Hello Python"}]

■JSON 문자열을 리스트로 변환하는 방법(JSON to List)

json.loads()함수를 사용하여 변환 가능합니다.

import json

jsonstr = '[{"a": 1, "b": "Go outside"}, {"c": "홍길동", "d": "Hello Python"}]'

alist = json.loads(jsonstr)
print(type(alist))
print(alist)

print(alist[0])
print(alist[0]['b'])



#실행결과
<class 'list'>
[{'a': 1, 'b': 'Go outside'}, {'c': '홍길동', 'd': 'Hello Python'}]
{'a': 1, 'b': 'Go outside'}
Go outside

■JSON배열을 파이썬 리스트로 변환하는 방법(JSON Arrays to List)

json.loads()함수를 사용하여 변환가능합니다.

리스트 배열의 값을 출력하는 방법에 대해서 예제코드에 포함하였습니다.

import json

jsonstr = '[[{"a": 1, "b": "Go outside"}], [{"c": "홍길동", "d": "Hello Python"}]]'

alist = json.loads(jsonstr)
print(type(alist))
print(alist)

print(alist[0])
print(alist[0][0])
print(alist[0][0]['b'])



#실행결과
<class 'list'>
[[{'a': 1, 'b': 'Go outside'}], [{'c': '홍길동', 'd': 'Hello Python'}]]
[{'a': 1, 'b': 'Go outside'}]
{'a': 1, 'b': 'Go outside'}
Go outside

■튜플 자료형(Tuple) : Immutable

List와 비슷합니다. 차이점은 READ-ONLY!!! 한번 지정한 값은 변경할 수 없습니다. 

List는 [ ]대괄호를 사용하여 묶지만, Tuple은 ( ) 소괄호로 묶어서 사용하며, 소괄호는 생략할 수 있습니다.

또하나의 List와 다른점은 값의 구분자로 콤마(,)를 사용해야합니다.

a = (1, 2, 3, 4, 5)
b = (1, 2, (3, 4, 5))
c = ()
d = 1, 2, 3

■딕셔너리 자료형(Dictionary)

파이썬의 딕셔너리는 키=값의 구조로 이루어진 해시 테이블을 의미합니다. 중괄호를 사용하여 선언합니다.

값으로 리스트뿐만 아니라 집합 자료형 등도 가능합니다.

a = {'key1':'value1', 'key2':'value2'}

#별도로 추가
a['key3'] = 'value3'

b = {'key1':[1, 2, 3], 'key2': (4, 5, 6)}

c = dict(a='Hello', b='World')

d = {1: 'first', 2: 'second', 3: 'third'}

[실행결과] 키값을 통해 접근 가능합니다.

print (c)
{'a': 'Hello', 'b': 'World'}

print (c['a'])
Hello

비어있는 딕셔너리를 만들고 싶은 경우 dict()함수를 사용합니다.

a = dict()

딕셔너리의 키값과 벨류값만 별도로 보고싶은 경우 .keys()메소드와 .values()메소드를 사용합니다.

items()는 key, value 값를 보여줍니다.  값에 접근하고자하는 겨우  get()메소드를 사용합니다.

c = dict(a='Hello', b='World')
c.keys()
#실행결과
dict_keys(['a', 'b'])

c.items()
#실행결과
dict_items([('a', 'Hello'), ('b', 'World')])

c.values()
#실행결과
dict_values(['Hello', 'World'])


c.get('a')
#실행결과
'Hello'


c.get('c','없음으로 기본값 리턴')
#실행결과
'없음으로 기본값 리턴'

삭제는 리스트와 같은 방법으로 del()함수를 사용합니다.

clear()메소드를 사용하여 딕셔너리의 모든 데이터를 삭제할 수 있습니다.

c = dict(a='Hello', b='World')

del c['a']
print(c)

#실행결과
{'b': 'World'}

c.clear()
print(c)

#실행결과
{}

딕셔너리의 키값의 존재여부를 체크는 방법은 in 키워드를 사용합니다. 결과에 따라 True와 False를 반환합니다.

c = dict(a='Hello', b='World')
del c['a']

print('a' in c)
False

print('b' in c)
True

■JSON문자열을 파이썬 딕셔너리(Diction)로 변환하기 

json.loads()함수를 사용합니다.

import json

jsonstr = '{"a": 1, "b": "Go outside", "name": "홍길동", "insa": "Hello Python"}'

obj = json.loads(jsonstr)
print(type(obj))
print(obj)

print(obj['name']) 


#실행결과
<class 'dict'>
{'a': 1, 'b': 'Go outside', 'name': '홍길동', 'insa': 'Hello Python'}
홍길동

다음 샘플코드는 JSON배열을 리스트로 파씽하는 방법입니다. 배열로 접근하게되면 딕셔너리 자료형임을 확인할 수 있습니다.

import json

jsonstr = '[{"name": "홍길동", "insa": "Hello Python"},{"name": "IU", "insa": "Hello IU"}]'

obj = json.loads(jsonstr)
print(type(obj))
print(type(obj[0]))

print(obj[1]['name'])


#실행결과
<class 'list'>
<class 'dict'>
IU

■집합자료형 (Set)

중복을 허용하지 않으며, 순서가 없습니다. 순서가 없다는 것은 값을 지정할때 랜덤으로 지정된다는 뜻입니다. 아래 샘플코드의 실행결과를 보면 이해가 빠릅니다.

a = set('Hello World!')
print(a)

[실행결과]

{'d', 'r', 'e', '!', 'H', ' ', 'W', 'l', 'o'}

List와 Tuple은 순서가 있음으로 인덱스 값을 통해 접근할 수 있습니다. Set은 Dictionary와 비슷하게 순서가 없는 자료형임으로 인덱싱을 지원하지않습니다. 이 말은 a[3]과 같은 방법으로 접근하면 TypeError를 발생시킵니다.

>>> print(a[0])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'set' object is not subscriptable
>>>

Set은 교집합, 차집합, 합집합 등 집합 연산에 있어 매우 유리합니다.

a = set([1, 2, 3, 4, 5, 6])
b = set([5, 6, 7, 8, 9, 0])

print(a & b)  #실행결과 {5, 6}
print(a | b)  #실행결과 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
print(a - b)  #실행결과 {1, 2, 3, 4}
print(b - a)  #실행결과 {0, 8, 9, 7}

교집합, 합집합, 차집합의 방법으로 intersection(), union(), difference()메소드를 사용할 수 있습니다.

a = set([1, 2, 3, 4, 5, 6])
b = set([5, 6, 7, 8, 9, 0])

print(a.intersection(b))  #실행결과 {5, 6}
print(a.union(b))  #실행결과 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
print(a.difference(b))  #실행결과 {1, 2, 3, 4}
print(b.difference(a))  #실행결과 {0, 8, 9, 7}

Set자료형은 add()메소드를 사용하여 값을 추가합니다. 이미 존재하는 값을 추가하는 경우 추가되지 않습니다.

a = set([1, 2, 3, 4, 5, 6])
a.add(22)
print(a)

#실행결과
{1, 2, 3, 4, 5, 6, 22}

a.add(22)
print(a)
{1, 2, 3, 4, 5, 6, 22}

Set자료형은 update()메소드를 사용하여 여러 개의 값을 추가할 수 있습니다. 그 값으로 List나 Tuple과 같은 자료형의 데이터만 추가할 수 있습니다.

a = set([1, 2, 3, 4, 5, 6])
a.update([11])
a.update([11,22,33,44])
print(a)

#실행결과
{1, 2, 3, 4, 5, 6, 33, 11, 44, 22}

Set자료형은 remove()메소드를 사용하여 삭제합니다. 제거 대상의 인덱스가 아닌 값을 지정합니다. 지우려는 값이 없을 경우 KeyError가 발생합니다. 값이 있는 경우에만 삭제됩니다.

a = set([1, 2, 3, 4, 5, 6])
a.remove(1)
print(a)

#실행결과
{2, 3, 4, 5, 6}

set자료형은 discard()메서드를 사용하여 삭제할 수 도 있었어요. remove()와 달리 값이 없어도 오류가 발생하지 않고, 값이 있는 경우에만 삭제합니다. 특정 요소를 안전하게 제거할 수 있는 거죠.

a = set([1, 2, 3, 4, 5, 6])
a.discard(1)
print(a)
a.discard(1)

set자료형은 pop()메서드를 사용하여 삭제할 수 있습니다. 제일 앞쪽 값부터 삭제합니다. 

비어있는 경우 pop()를 시도하면 KeryError: pop form an empty set오류가 발생해요.

a = set([1, 2, 3, 4, 5])
a.pop()
print(a)
a.pop()
print(a)
a.pop()
print(a)
a.pop()
print(a)
a.pop()
print(a)
a.pop()
print(a)



#실행결과
{2, 3, 4, 5}
{3, 4, 5}
{4, 5}
{5}
set()

for문에서 set의 크기에 변화를 주면 RuntimeError: Set changed size during iteration 오류가 발생해요. pop(), add(),discard(),remove() 등의 작업은 오류가 발생하네요. 반복문을 사용할 수 없는 걸까요?

a = set([1, 2, 3, 4, 5])
print(f'초기 사이즈 : {len(a)}')
for i in a:
    if len(a) > 0:
        a.pop()
        #a.add(12)
        #a.discard(1)
        #a.remove(2)
        print(a)


#실행결과
Traceback (most recent call last):
  File "C:\python\Workspace\main.py", line 3, in <module>
    for i in a:
RuntimeError: Set changed size during iteration
초기 사이즈 : 5
{1, 3, 4, 5}

[REFERENCE]

파이썬 자습서

Python 3.9.1rc1 문서

blog.myungseokang.dev/posts/python-basic-grammar1/

[파이썬 더 알아보기]

파이썬(python) 클래스(class) 와 생성자(init) 사용방법 및 예제

Leave a Reply

error: Content is protected !!