리스트(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

Python도 다른 프로그래밍 언어와 똑같이 파일을 읽고, 쓰는 작업을 지원한다.

file = open('test.txt','r')		#파일 열기	'r'은 파일을 읽겠다는 뜻.(read)
contents = file.read()			#파일을 읽어서 contents변수에 저장
file.close()					#파일 닫기
print(contents)


>>I like Python

#test.txt

I like Python


파일을 읽고 쓰는 법은 위와 같다.

파일을 열었으면 작업을 끝낸 후 꼭 닫아주어야 하는데, 위의 방식을 사용한 채로 작업을 진행하다 문제가 생기면 

file.close() 문을 실행할 수 없게 된다. 해당 문장을 생략해도 프로그램을 종료할 때 파이썬이 열려 있는 파일의 객체를 자동으로 닫아주기는 하지만, close()를 사용해 열려 있는 파일을 직접 닫아주는 것이 좋다. 쓰기모드로 열었던 파일을 닫지 않고 다시 사용하려고 하면 오류가 발생하기 때문이다.

파이썬은 이와 같은 상황에 대비해 오류가 발생하든 안 하든 항상 파일을 깔끔하게 정리할 수 있게 with 문을 제공한다.

#with문 형식

with <<expression>> as <<variable>> :

     작업 코드....



사용 예시

with open('test.txt','r') as file:
	contents = file.read()
    
print(contents)

x=file.read()		#with문 밖에서 file을 읽으려고함. 오류발생. (파일이 잘 닫혔다는 뜻)
print(x)

>>I like Python
Traceback (most recent call last):
  File "...................................", line 6, in <module>
    x=file.read();
ValueError: I/O operation on closed file.

Process finished with exit code 1

with문을 사용하면 close문을 쓰지 않아도 파일이 잘 닫히는 것을 볼 수 있다.

특수한 경우가 아니라면 with문을 사용하자.

어떠한 이유가 있어 with문을 사용하지 않는다면 잊지말고 close()문으로 파일을 잘 닫아주도록하자.

 

 

출처 : 파이썬 프로그래밍 교과서(개정 3판)

'Python' 카테고리의 다른 글

Python - 컬렉션 정리  (0) 2020.08.04
Python - 딕셔너리 키(key), 값(value) 도치  (0) 2020.08.04
Python - is와 ==의 차이 (and,or,&,|)  (1) 2020.07.29
Python - 에일리어스(alias)  (0) 2020.07.29
Python - 모듈(module)  (0) 2020.07.27

+ Recent posts