리스트(List)


다른 언어의 "배열"과 비슷한 구조라고 생각하면 쉽다. 하지만 파이썬의 리스트는 동적 배열로서 인덱스 조절 없이 자유롭게 값의 추가와 삭제가 가능하다.

리스트는 값들을 [](대괄호)로 감싸서 표현이 가능하다. 자세한 설명은 예시를 보자.

x=[] #빈 리스트 선언
x=[1, 2.0, True, 'str'] #값을 할당하는 방법, 모든 자료형이 리스트에 들어갈 수 있다.
print(x[0])	#리스트를 인덱싱 하는 법, 인덱스는 0부터 시작.
print(x[-1])#음수 인덱싱 가능, 0을 기준으로 뒤로간다고 생각하면 편함.
print(x[0:2]) #리스트 슬라이싱, 인덱스 0부터 1까지의 값을 리스트로 반환.(2는 포함하지않는다.)
x.append(5); #리스트의 맨 뒤에 값을 추가하는 메서드
print(x);
x.insert(2,4); #2번 인덱스에 4라는 값을 추가하는 메서드
print(x);
del x[-1];      #해당 인덱스의 값을 리스트에서 삭제(예시에서는 맨 뒤의 값 삭제)
print(x);
x.remove(1);    #리스트에서 찾은 1 중 가장 낮은 인덱스를 가진 값 삭제(1이 존재하지않으면 오류)
print(x);
x.index(True);  #True라는 값을 가진 인덱스를 반환(위와 같이 True가 많으면 가장 낮은 인덱스 반환)


>>1
>>str
>>[1, 2.0]
>>[1, 2.0, True, 'str', 5]
>>[1, 2.0, 4, True, 'str', 5]
>>[1, 2.0, 4, True, 'str']
>>[2.0, 4, True, 'str']

리스트는 위와 같이 값들의 변경이 가능하고, 인덱스를 통해 정렬되어있다.

 

튜플(Tuple)


튜플은 ()(소괄호)를 이용해 생성한다. 리스트와 비슷하나 튜플은 값의 변경(추가 삭제 갱신)이 불가능하다.

x=(1,2,3,4);	#튜플 생성
x=(1)			#튜플x, int형 number.
x=(1,)			#튜플o, 한개의 값을 튜플로 만들 때는 ,구분자를 넣어주어야한다.
#x[1]=3     ->오류발생, (변경불가)
#del x[1]   ->오류발생, (삭제불가)
print(x[1]);
print(x[0:2]);  #인덱싱과 슬라이싱 가능, 리스트와 똑같이 [](대괄호)를 이용하여 인덱싱

>>2
>>(1, 2)

튜플 내 값은 변경이 불가능하나 튜플 내 객체는 변경이 가능하다.

x=([1,2],[3,4],[5,6]);
x[0][0]=3;	#2중 인덱싱 x[0]= [1,2]		->x[0][0]=1;
print(x);

>>([3, 2], [3, 4], [5, 6])

튜플또한 인덱싱이 가능한 정렬된 값들의 모음이다.

 

셋(Set)


셋이란 중복이 없는 정렬되지 않은 값들의 모음이다.(수학에서의 집합을 생각하면 편하다.) 정렬이 되지 않았으니 리스트, 튜플과는 다르게 인덱싱과 슬라이싱이 불가능하다.

셋은 {}(중괄호)를 이용해 생성할 수 있다. 하지만 빈 셋(Set)은 {}로 생성이 불가능하다.

x=set();
x={1,2,3};
x.add(3);           #3 추가
print(x);           #이미 3이란 값이 존재하므로 셋은 변하지 않는다.
x.remove(3);        #3 삭제
print(x);
x.update({2,3,4});  #한번에 여러개의 값 추가
print(x);
#print(x[1])        정렬이 되어있지않아 인덱싱 불가, 따라서 값의 변경도 불가능하다.


>>{1, 2, 3}
>>{1, 2}
>>{1, 2, 3, 4}

 

셋(Set)끼리의 연산

수학에서 사용하는 집합 연산(교집합, 합집합 등)이 셋(Set)에서도 가능하다.

x={0,1,2,3,4};
y={1,3,5,7,9};

print(x.difference(y));     #x-y    차집합
print(x.intersection(y));   #x&y    교집합
print(x.symmetric_difference(y));   #교집합의 여집합
print(x.union(y));          #x|y    합집합

>>{0, 2, 4}
>>{1, 3}
>>{0, 2, 4, 5, 7, 9}
>>{0, 1, 2, 3, 4, 5, 7, 9}

 

 

딕셔너리(Dictionary)


파이썬에서의 딕셔너리(dictionary)는 단어와 정의를 연결하는 사전과 비슷하다.

단어와 정의 대신 key와 value를 연결해주는 역할을 한다.

딕셔너리 내에서 key는 중복될 수 없고 변경이 불가능하다.(key를 모으면 셋(Set)이 된다.) value는 중복이 가능하다.

딕셔너리도 셋과 같이 {}(중괄호)를 이용해 생성할 수 있다. 

x={} 	#빈 딕셔너리 생성(Set이 {}로 빈 Set을 생성하지 못하는 이유)
x={'a':1,'b':2,'c':3};  #key와 value 사이에 콜론(:)을 넣어 서로를 연결
y={'c':3,'b':2,'a':1};
print(x==y)             #딕셔너리는 정렬이 되어있지않기 때문에 True 출력
print(x.keys())     #딕셔너리 x의 모든 key를 셋(Set)과 유사한 객체로 반환.
print(x.values())   #딕셔너리 x의 모든 value를 셋(Set)과 유사한 객체로 반환.
print(x.items())    #딕셔너리 x의 모든 key와 value쌍을 셋(Set)과 유사한 객체로 반환.
print(x.get('a'))   #a라는 key와 연결된 value를 반환. 해당 key가 없으면 None반환.
print(x.get('d',4)) #d라는 key와 연결된 value를 반환. 해당 key가 없으면 기본값으로 4 반환.
print(x['a']);      #인덱싱 가능 

>>True
>>dict_keys(['a', 'b', 'c'])
>>dict_values([1, 2, 3])
>>dict_items([('a', 1), ('b', 2), ('c', 3)])
>>1
>>4
>>1

 

 

 

컬렉션으로 여러 변수에 동시 할당


w={'a':2,'b':3,'c':4};
x=[1,2,3];
y=(4,5,6);
z={7,8,9};

a,b,c=w;	#딕셔너리는 key를 반환
print(a,b,c);

a,b,c=w.values();	#values() 메서드를 이용해 value 반환가능
print(a,b,c);

a,b,c=x;
print(a,b,c);

a,b,c=y;
print(a,b,c);

a,b,c=z;
print(a,b,c);



>>a b c
>>2 3 4
>>1 2 3
>>4 5 6
>>8 9 7

일반적인 할당문처럼 파이썬은 = 기호 오른쪽에 있는 모든 표현식을 먼저 평가하고, 이어서 왼쪽에 있는 변수에 그 값을 할당한다.

'Python' 카테고리의 다른 글

Python - 예외처리  (0) 2020.08.10
Python - 클래스(Class)와 객체(Object)  (0) 2020.08.09
Python - 딕셔너리 키(key), 값(value) 도치  (0) 2020.08.04
Python - with 문  (0) 2020.08.01
Python - is와 ==의 차이 (and,or,&,|)  (1) 2020.07.29

딕셔너리를 사용하다보면 key와 value를 서로 바꾼 형태의 새로운 딕셔너리를 만들 일이 생긴다.

key와 value를 도치시키는 코드를 직접 짜보면

a={'a':1,'b':2,'c':3,'d':1}; #도치 대상

b={}; #도치 후 저장할 딕셔너리
for key, value in a.items():
    if value in b:
        b[value].append(key);	#이미 (value)를 키로 하는 값 (key)가 존재	->괄호안의 값은 변수
    else:
        b[value]=[key];			#해당 value,key값이 존재하지 않으면

print(b);

>>{1: ['a', 'd'], 2: ['b'], 3: ['c']}

위와 같이 할 수 있겠지만 더 간단한 방법으로는 컬렉션 내포(Comprehension)를 사용하는 것이다.

컬렉션 내포란 지정된 표현식을 사용해 좀 더 간단히(?) 컬렉션을 생성하는 방법이다.

리스트, 딕셔너리, 셋 모두 가능하지만 이 글에서는 딕셔너리에 대한 예시를 보겠다.

 

a={'a':1,'b':2,'c':3,'d':1}; #도치 대상
b={value:key for key,value in a.items()}	#딕셔너리 컬렉션 내포 표현식
print(b);

>>{1: 'd', 2: 'b', 3: 'c'}

 위와 같이 좀 더 간단하게 표현이 가능하다.

하지만 뭔가 이상한 것을 볼 수 있다. 우리 생각대로라면 위처럼 1:['a','d']가 나와야겠지만 컬렉션 내포 방식으로는 하나의 key당 하나의 value만 저장이 가능하다.

따라서 동일한 value가 없는 것을 한눈에 알아볼 수 있는 딕셔너리라면 컬렉션 내포 방식을 사용하는 것이 편하겠지만 대부분의 딕셔너리는 맨 위의 예시와 같이 도치시키는 것이 좋다.

'Python' 카테고리의 다른 글

Python - 클래스(Class)와 객체(Object)  (0) 2020.08.09
Python - 컬렉션 정리  (0) 2020.08.04
Python - with 문  (0) 2020.08.01
Python - is와 ==의 차이 (and,or,&,|)  (1) 2020.07.29
Python - 에일리어스(alias)  (0) 2020.07.29

+ Recent posts