# 파이썬 딕셔너리



딕셔너리란 대응되는 데이터를 Key:Value 형식으로 저장할 수 있는 자료구조입니다. 타 언어에서는 연관배열이나 해시맵이라고 하죠?


딕셔너리는 리스트처럼 순차적으로 요소에 접근하는 시퀀스 자료형이 아닙니다. 반드시 Key를 통하여 Value값을 얻습니다. 예를 들어 language라는 KeyPython이라는 Value가 저장되어있을 경우 language를 통해 Python이라는 값을 얻을 수 있습니다.



1. 딕셔너리 선언


딕셔너리의 각 요소는 Key:Value 형태로 이루어져 있고 쉼표(",")로 데이터를 구분 짓습니다. 그리고 Key와 Value가 같은 자료형일 필요는 없습니다. Key가 문자열이고 Value가 숫자나 리스트나 딕셔너리여도 상관이 전혀 없습니다.

하지만 만약 중복되는 키를 입력시에는 데이터가 무시 되기 때문에 필수적으로 중복검사를 실시해야 합니다.


1
2
3
dic ={} # 빈 딕셔너리 선언
dic = dict() # 빈 딕셔너리 선언
dic = {"Key":"Value","number":1234#여러데이터 저장 가능
cs



2. 딕셔너리 값 추가 및 수정


딕셔너리의 값을 수정하기 위해서는 먼저 요소에 키를 통하여 접근할 필요가 있습니다. 만약 수정하려는 값의 key가 2일 경우에는 2로 접근하시면 됩니다.

값을 추가하고 싶은 경우에도 마찬가지입니다. 딕셔너리 이름이 dic일 경우에 dic["newKey"] 처럼 새로운 키를 설정해주고 값을 대입하면 됩니다. newKey라는 키는 제가 임의로 만든것이며 어떤 값이여도 상관없습니다. 


1
2
3
4
5
6
dic = {1:"a"}
dic[2= "b"
# dic == {1:"a",2:"b"}
 
dic[2= "c"
# dic == {1:"a",2:"c"}
cs



3. 딕셔너리 데이터 접근


리스트에서는 요소 값에 접근하기 위하여 인덱싱을 사용하였지만 딕셔너리는 인덱싱이아니라 Key이름을 기반으로 데이터에 접근합니다.


1
2
3
dic = {"apple":500,"banana":1000}
#dic["apple"] == 500
#dic["banana"] == 1000
cs



# 딕셔너리 내장함수



1. keys


딕셔너리 모든 Key를 객체로 리턴합니다. key만을 추출할 때 사용합니다.


1
2
3
4
dic = {"apple":500"banana":1000}
dic.keys()
 
#dict_keys(['apple', 'banana'])
cs



2. values


딕셔너리 모든 Value를 객체로 리턴합니다. Value만을 추출할 때 사용합니다.


1
2
3
4
dic = {"apple":500"banana":1000}
dic.values()
 
# dict_values([500, 1000])
cs


3. items


items 함수는 딕셔너리의 모든 데이터를 객체로 리턴합니다.


1
2
3
4
dic = {"apple":500"banana":1000}
dic.items()
 
# dict_items([('apple', 500), ('banana', 1000)])
cs


4. get


get함수는 키를 알고 있을 데 value를 추출할 때 사용합니다.


1
2
3
4
dic = {"apple":500"banana":1000}
dic.get("apple")
 
# 500
cs



'Dev > python' 카테고리의 다른 글

[python] 제어문(if, for, while) - 1  (0) 2019.02.15
[python] 튜플과 Immutable  (0) 2019.02.14
[python] 리스트 함수  (0) 2019.02.11
[python] 리스트와 Shallow Copy  (0) 2019.02.10
[python] 문자열 함수  (0) 2019.02.09

# 리스트 함수



일전 문자열 내장함수 강의를 보면 알 수 있듯이 리스트도 문자열과 마찬가지로 리스트뒤에 "."을 사용하여 내장함수를 사용할 수 있습니다.


1. append


append 함수는 리스트에 요소를 추가할 때 사용합니다. append에 의하여 추가된 요소는 리스트의 맨 뒤에 저장됩니다. 값이 존재하지 않는 빈리스트일 경우에도 마찬가지로 첫번째 인자부터 새로 생성됩니다. 


1
2
3
4
5
6
7
8
#!/usr/bin/python36
arr = [1,2,3]
arr.append(4)
 
print(arr)
 
#결과값
[1234]
cs



2. extend


append는 유용하지만 여러 원소를 한번에 집어 넣거나 리스트끼리 합치는것은 불가능 합니다. 이런 경우는 어떻게 해결할까요? 바로 extend를 사용하시면됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/python36
arr = [1,2,3]
arr.extend([3,4,5,6,7])
 
print(arr)
 
arr = [1,2,3]
arr = arr + [3,4,5,6,7]
 
print(arr)
#결과값
[12334567]
[12334567]
cs


extend함수는 사실 list의 더하기 연산과 크게 다르지 않습니다.  + 연산자가 편하신 분은 +를 사용하고 extend를 쓰고 싶은 분은 extend를 사용하면 됩니다.


참고 : https://stackoverflow.com/questions/3653298/concatenating-two-lists-difference-between-and-extend


3. reverse


리스트를 생성하고 인자의 순서를 반대로 뒤집고 싶을 경우에는 어떻게 하면 될까요? 해답은 바로 reverse 함수에 있습니다.


1
2
3
4
5
6
7
#!/usr/bin/python36
arr = [1,2,3]
arr.reverse()
print(arr)
 
#결과값
[3,2,1]
cs


4. sort


뒤집는 것도 좋지만, 리스트 안의 값을 정렬하고 싶을경우에는 어떻게 하냐고요? sort함수를 사용하시면 됩니다.

sort함수는 리스트를  정렬해주는 함수입니다. 기본적으로 오름차순으로 정렬해주며 reverse라는 인자의 값을 True로 바꿔주면 내림차순으로 정렬해줍니다.

추가적으로 sorted 함수는 arr의 값에 영향을 미치지 않으면서 바꿀 수 있는 내장함수입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/python36
arr = [5,2,7]
print(sorted(arr))
 
print(arr)
 
arr.sort()
print(arr)
 
arr.sort(reverse=True)
print(arr)
 
#결과값
[257#sorted
[527#arr
[257#sort
[752#sort-reverse
cs



5. remove


remove함수는 리스트에 존재하는 인자를 제거하는 함수입니다. 인자의 값이 중복되는 상황이면 인덱스가 낮은 수 먼저 제거합니다.


1
2
3
4
5
6
7
8
9
#!/usr/bin/python36
arr = [1,5,2,7,1]
arr.remove(1)
print(arr)
arr.remove(1)
print(arr)
#결과값
[5271]
[527]
cs


6. insert


위에서 append를 언급했을 때 분명히 맨앞에서 부터 추가하는 방법이 궁금하셨던 분들 계실겁니다. insert 함수는 인자로 인덱스와 값을 받아서 해당인덱스에 값을 추가하는 방식으로 구동됩니다.


1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python36
arr = [1,5,2,7,1]
arr.insert(0,10)
print(arr)
arr.insert(100,10)
print(arr)
 
#결과값
[1015271]
[101527110]
cs

insert함수의 인덱스를 리스트의 길이보다 크게 주었을 경우에는 append와 똑같은 위치에 인자가 삽입됩니다. 그리고 인덱스 값으로 음수를 주면 뒤에서 부터 삽입이 가능합니다.



7. pop


자료구조를 구성할 때 단골손님처럼 쓰이는 함수, pop입니다.

pop는 기본적으로 맨뒤의 인자를 remove하면서 동시에 return하는데요 함수 인자값으로 인덱스를 넣는 것이 가능하여 원하는 위치의 값을 remove하면서 return하는 것이 가능합니다.


1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python36
arr = [1,5,2,7,1]
print(arr.pop())
print(arr.pop(0))
print(arr)
 
#결과값
1
1
[527]
cs


'Dev > python' 카테고리의 다른 글

[python] 튜플과 Immutable  (0) 2019.02.14
[python] 딕셔너리(dictionary)  (0) 2019.02.13
[python] 리스트와 Shallow Copy  (0) 2019.02.10
[python] 문자열 함수  (0) 2019.02.09
[python] 문자열  (0) 2019.02.07

# 파이썬 리스트



리스트란 여러가지 데이터를 저장하는 자료구조입니다. 리스트를 이용하면 숫자나 문자열 등의 데이터를 다량의 변수를 선언하지 않고도 간단하게 표현할 수 있습니다.

무엇보다 Python에서의 리스트는 자료형에 구애받지 않고 자료형에 상관없이 한개의 리스트에 혼합하여 저장할 수 있는 장점이 있습니다.


1. 리스트의 생성 및 데이터 저장


1
2
3
4
5
6
arr1 = [1,2,3,4,5# ok
arr2 = ["a","b","c","d"# ok
arr3 = ["1",2,"3",4,"babo"# ok
arr4 = [1,2,[3,4,5,6]] # ok
arr5 = [] # 빈 리스트 생성
arr6 = list() # 빈 리스트 생성
cs



2. 인덱싱


리스트는 문자열과 같이 인덱싱을 적용하는것이 가능합니다. 리스트의 첫번째 요소를 0번 인덱스로 지정하고 마지막요소에 리스트의 크기-1 인덱스를 지정합니다.

- 참고 : 마지막 인덱스는 -1로 표현하고 1씩 감하여 이전 인덱스를 표현합니다.


1
2
3
4
5
arr = [1,2,3,4,5]
# a[0] == 1
# a[4] == 5
# a[-1] == 5
# a[-2] == 4
cs


만약, 리스트안에 다중으로 리스트가 들어있는 경우에는 인덱싱을 두번하여 중첩 리스트안에 있는 데이터에 접근할 수 있습니다.


1
2
3
arr = [1,2,[1,2,3]]
# arr[-1] == [1,2,3]
# arr[-1][-1] == [3]
cs



3. 슬라이싱


리스트는 문자열과 마찬가지로 인덱싱 뿐만아니라 슬라이싱 또한 가능합니다.  범위를 지정하여 시작 인덱스의 요소부터 마지막 인덱스의 요소로 구성된 리스트로 분할합니다.


1
2
3
arr=[1,2,3,4,5]
# arr[0:2] = [1,2]
# arr[2:] = [3,4,5]
cs


4. 리스트 요소 수정


리스트의 데이터를 변경하고 싶을 경우에는 해당 인덱스에 대입연산자를 사용하여 데이터를 삽입하면 됩니다.


1
2
3
arr = [1,2,3,4,5]
arr[0= 5
# arr == [5,4,3,2,5]
cs




# 객체의 복사


파이썬에서는 리스트도 객체에 해당하기 때문에 복사를 하게되면 바로보는 객체가 동일하기 때문에 두개의 리스트 중 하나만 변경해도 나머지 하나가 동일하게 수정되는 현상이 발생합니다.


1. shallow copy(얕은 복사)


1
2
3
4
5
6
7
8
9
10
11
= [1234]
= a
print(b)
b[2= 5
print(b)
print(a)
 
#결과값
[1234]
[1254]
[1254]
cs


a라는 변수를 선언하고 리스트를 만들어 a에 할당하면 a는 리스트객체의 주소가 저장된 변수가 됩니다.

그럼 a라는 변수의 값을 b라는 인자에 할당하였을 경우, b는 a와 같은 객체의 주소가 저장된 변수가 되는걸까요? 정답은 예,그렇습니다. b를 불러와 인덱스 2번의 값을 5로 변경하면, a에도 똑같이 적용되어 a의 값이 1,2,5,4가 되는 것을 위의 코드를 통하여 알 수 있습니다.



리스트는 값을 대입하면 값에 대한 메모리가 새로이 할당되는 것이 아닌 기존 값의 메모리 주소를 공유하기 때문에 발생하게 됩니다. 리스트 같은 경우 리스트 자체뿐만 아니라 리스트 내 요소들도 같은 주소를 공유하고 있습니다. 이를 Shallow Copy(얕은 복사)라고 부릅니다.



2. Deep Copy(깊은 복사)


이러한 현상을 방지하기 위해서는 Deep copy를 사용하여 복사하면 됩니다. 방법은 간단합니다. 기본라이브러리인 copy를 사용하는 방법이 있지만 더욱 간단한 사용을 위해 다른방법을 설명드리겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#1번 방법
= [1234]
= a[:]#리스트 슬라이싱
print(b)
b[2= 5
print(b)
print(a)
 
#2번 방법
= [1234]
= list(a)#리스트 내장함수사용
print(b)
b[2= 5
print(b)
print(a)
 
#결과값(1번과 2번 동일)
[1234]
[1254]
[1234]
cs


간단하게 리스트를 슬라이싱하여 대입하면 shallow copy가 일어나지 않습니다. 또 list 내장함수를 사용하면 Deep copy가 진행되어 리스트 복사문제를 해결 할 수 있습니다.

'Dev > python' 카테고리의 다른 글

[python] 딕셔너리(dictionary)  (0) 2019.02.13
[python] 리스트 함수  (0) 2019.02.11
[python] 문자열 함수  (0) 2019.02.09
[python] 문자열  (0) 2019.02.07
[python] 기본자료형 - 숫자  (0) 2019.02.07

+ Recent posts