본문 바로가기

자료구조/자료형

Map/Dict - Python, Dart, Golang

Python

 

선언

 

>>> dic = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}

 

추가

 

>>> a = {1: 'a'}
>>> a[2] = 'b'
>>> a
{1: 'a', 2: 'b'}


>>> a['name'] = 'pey'
>>> a
{1: 'a', 2: 'b', 'name': 'pey'}


>>> a[3] = [1,2,3]
>>> a
{1: 'a', 2: 'b', 'name': 'pey', 3: [1, 2, 3]}

 

수정

 

>>> a[2] = 'c'
>>> a
{1: 'a', 2: 'c', 'name': 'pey', 3: [1, 2, 3]}

 

삭제

 

>>> del a[1]
>>> a
{2: 'c', 'name': 'pey', 3: [1, 2, 3]}


>>> a.clear()
>>> a
{}

 

리스트로 변환

 

>>> list(a.keys())
['name', 'phone', 'birth']

 

 

>>> a = {'name': 'pey', 'phone': '0119993323', 'birth': '1118'}
>>> a.keys()
dict_keys(['name', 'phone', 'birth'])


>>> a.values()
dict_values(['pey', '0119993323', '1118'])


>>> a.items()
dict_items([('name', 'pey'), ('phone', '0119993323'), ('birth', '1118')])


>>> for k in a.keys():
...     print(k)
...
name
phone
birth

 

관련 함수들

 

get - a['nokey']처럼 존재하지 않는 키(nokey)로 값을 가져오려고 할 경우 a['nokey']는 Key 오류를 발생시키고 a.get('nokey')는 None을 돌려준다는 차이가 있다.

 

>>> a = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}
>>> print(a.get('nokey'))
None
>>> print(a['nokey'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'nokey'



딕셔너리 안에 찾으려는 Key 값이 없을 경우 
미리 정해 둔 디폴트 값을 대신 가져오게 하고 싶을 때에는 get(x, '디폴트 값')을 사용하면 편리하다.
>>> a.get('nokey', '111')
'111'

 

in - 특정 key가 dict 안에 있는지 확인

 

>>> a = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}
>>> 'name' in a
True
>>> 'email' in a
False

 

Dict() - 딕셔너리 만들기

 

// 딕셔너리 = dict(키1=값1, 키2=값2)
test1 = dict(a=490, b=334, c=550, d=18.72)
print(test1)

// 딕셔너리 = dict(zip([키1, 키2], [값1, 값2]))
test2 = dict(zip(['a', 'b', 'c', 'd'], [490, 334, 550, 18.72]))
print(test2)

// 딕셔너리 = dict([(키1, 값1), (키2, 값2)])
test3 = dict([('a', 490), ('b', 334), ('c', 550), ('d', 18.72)])
print(test3)

// 딕셔너리 = dict({키1: 값1, 키2: 값2})
test4 = dict({'a': 490, 'b': 334, 'c': 550, 'd': 18.72})
print(test4)
{'a': 490, 'b': 334, 'c': 550, 'd': 18.72}
{'a': 490, 'b': 334, 'c': 550, 'd': 18.72}
{'a': 490, 'b': 334, 'c': 550, 'd': 18.72}
{'a': 490, 'b': 334, 'c': 550, 'd': 18.72}

 

 

Dart

 

선언

 

Map my_map = {};
my_map['name'] = 'my map';

Map my_map2 = new Map{'name':'my map 2'};

Map my_map3 = new Map();
my_map3['name'] = 'my map 3';

 

추가

 

my_map['date'] = '20211006';

Map my_map3 = {'type': 'tutorial'};
my_map.addAll(my_map3);
print(my_map);	//{date: 20211006, type: tutorial}

 

수정

 

my_map['name'] = 'my map';
my_map['date'] = '20211006';
print(my_map);	//{name: my map, date: 20211006}


my_map['name'] = 'your map';
print(my_map);	// {name: your map, date: 20211006}

 

삭제

 

my_map['name'] = 'your map';
my_map['date'] = '20211006';
my_map['type'] = 'tutorial';

my_map.remove('name');
print(my_map);	//{date: 20211006, type: tutorial}

my_map.clear();
print(my_map);	//{}

 

검색

 

print(my_map.containsKey('name'));	// false
print(my_map.containsValue('20211006'));	// true

 

그외

 

.keys : Map에 담긴 key들을 이터러블 객체로 모아 돌려준다.
.values : Map에 담긴 value들을 이터러블 객체로 모아 돌려준다.
.entries : Map에 담긴 key-value 쌍(엔트리)들을 이터러블 객체로 모아 돌려준다.
print(my_map.keys);	// (date, type)
print(my_map.values);	// (20211006, tutorial)
print(my_map.entries);	// (MapEntry(date: 20211006), MapEntry(type: tutorial))
.isEmpty : Map이 비었다면 true, 그렇지 않다면 false를 반환한다.
.isNotEmpty : Map에 뭔가 들어 있다면 true, 비었다면 false를 반환한다.
length : Map에 든 key-value 쌍이 몇 개인지 반환한다.

 

리스트 to 맵 - Map.fromIterables

 

List<String> letters = ['I', 'V', 'X'];
List<int> numbers = [1, 5, 10];

Map<String, int> map = Map.fromIterables(letters, numbers);
print(map);

--------------------------------------------------

{I: 1, V: 5, X: 10}

======================================================

List<int> numbers = [1, 2, 3];

Map<String, int> map = Map.fromIterable(
  numbers,
  key: (k) => 'double ' + k.toString(),
  value: (v) => v * 2);

print(map);

--------------------------------------------------

{double 1: 2, double 2: 4, double 3: 6}

 

 

Golang

 

key의 자료형이 int이고, value의 자료형이 string인 map

 

package main

import "fmt"

func main() {
    map_int_str := make(map[int]string)
    map_int_str[1] = "월"
    map_int_str[2] = "화"
    map_int_str[3] = "수"
    map_int_str[4] = "목"
    map_int_str[5] = "금"
    map_int_str[6] = "토"
    map_int_str[7] = "일"
    fmt.Println(map_int_str)
}


func main() {
    map_int_str := map[int]string {
        1: "월",
        2: "화",
        3: "수",
        4: "목",
        5: "금",
        6: "토",
        7: "일",
    }
    fmt.Println(map_int_str)
}

 

value, ok := map_int_str[1]
fmt.Println(value, ok)
value, ok = map_int_str[5]
fmt.Println(value, ok)
value, ok = map_int_str[8]
fmt.Println(value, ok)

key가 1일떄 value는 ‘월’ ok 는 true가 반환
key가 5일떄 value는 ‘금’ ok 는 true가 반환
key가 8일떄 value는 (공백), ok 는 false가 반환

 

for key := 0; key < 10; key++ {
    if value, ok := map_int_str[key]; ok {
        fmt.Println(value)
    } else {
        fmt.Println("key", key, "is not exist")
    }
}

-----------------------------------------

key 0 is not exist
월
화
수
목
금
토
일
key 8 is not exist
key 9 is not exist