---
title: Data Structure
tags: python, data structure
---
[TOC]
## Inbuilt Data Structure
### List
> List is a mutable object.
> List is like one dimension array, more like vector in C/C++
#### 1. List Functions
- `list.append(elem)`
- Append elem to the tail of list
- `list.extend(iterable)`
- Extend the iterable and append all elems of it to the list
- EX: `[1,2].extend( (4,5) ) --> [1,2,4,5]`
- `list.insert(idx, elem)`
- Insert the elem to the idx
- EX: `[1,3,4,5].insert(1,2) --> [1,2,3,4,5]`
- `list.remove(elem)`
- Remove the **first** elem in the list
- Raise ValueError if elem is not in the list
- EX: `[1,2,1].remove(1) --> [2,1]`
- `list.pop([idx])`
- Remove the idx-th elem
- Remove the last elem if no idx
- `list.clear()`
- Clear all elems from the list
- Same as `del list[:]`
- `list.index(elem, [start [, end]])`
- Return the idx of the **first** elem
- Raise ValueError if elem is not in the list
- `list.sort(key=None, reverse=False)`
- Sort the list by key
- In-place Sort
- `list.copy()`
- Return the copied list
```python=
# Sort Example
# Initialize var
a = [9, 4, 7, 1]
a.sort()
## a = [1,4,7,9]
# Initialize var
b = [ (1, 'FC'), (-9, 'XY'), (4, 'KC'), (11, 'BZ') ]
# sort by default
# Try & Test & Think, What is default
b.sort()
## b = [(-9, 'XY'), (1, 'FC'), (4, 'KC'), (11, 'BZ')]
# sorted by 'word'
b.sort(key=lambda x : x[1])
## b = [(11, 'BZ'), (1, 'FC'), (4, 'KC'), (-9, 'XY')]
# sorted by the second character of the 'word'
b.sort(key=lambda x : x[1][1])
## b = [(1, 'FC'), (4, 'KC'), (-9, 'XY'), (11, 'BZ')]
```
```python=
# Four ways of copy
# Initilize var
a = [1,2,3]
# Copy
# Bad Way
b = []
for x in a:
b.append(x) or b.insert(len(b), x)
# Better Way
b = a.copy() # Use list copy function
b = [] + a # Use list concatenation
b = [x for x in a] # Use list comprehension
# Try & Test & Think
# Why don't we simply use
b = a
```
#### 2. List Slicing
> List 可以一次取出不只一個元素,用的就是 Slicing
##### Syntax
```python=
list[index1 : index2] #從index1取到index2(不包含index2)
```
##### Example
```python=
x = [1, 2, 3, 4]
x[0:2] # [1, 2]
x[1:-1] # [2, 3], 1和倒數第一個之間的元素
x[2:0] # [] , 若第一個索引的位置在第二個索引的位置之前
x[ :2] # [1, 2], 從開頭開始切
x[2: ] # [3, 4], 從2開始切到尾
x[ : ] # [1,2,3,4], 這邊是不一樣的list只是切出所有元素
```
#### 3. List Comprehension
> 這招必學,學會程式碼可以非常簡短!!
##### Basic Type
```python=
list_var = [ x for x in iterable ]
a = [1, 3, 5]
b = [x for x in a]
## b = [1, 3, 5]
apple = [c for c in 'apple']
## apple = ['a', 'p', 'p', 'l', 'e']
```
##### With Condition
```python=
odd_num = [n**2 for n in range(10) if n % 2]
## odd_num = [1, 9, 25, 49, 81]
# Equal to
odd_num = []
for n in range(10):
if n % 2:
odd_num.append(n**2)
# Nested If
nums = [n for n in range(100) if n % 2 == 0 if n % 5 == 0]
## nums = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
# Equal to
nums = []
for n in range(100):
if n % 2 == 0:
if n % 5 == 0:
nums.append(n)
```
##### With Nested Loop
```python=
nums = [ x*y for x in [1,2,3] for y in [10,20,30] ]
## nums = [10, 20, 30, 20, 40, 60, 30, 60, 90]
# Equal to what?
# Try & Test
```
#### 4. List Common Usage
```python=
# 1. Transform input to int
nums = list(map(int, input('Input Numbers: ').split(' ')))
# 2. Access elems dirtectly, not access by index
for elem in aList:
pass
# 3. Get list size
size = len(aList)
# 4. Delete element in list
aList = ['a', 'b', 'c', 3, 4, 5]
del aList[1] # aList == ['a', 'c', 3, 4, 5]
del aList[ :2] # aList == [3, 4, 5]
```
#### 5. List Common Error
```python=
aList = list(1, 2, 3)
## Raise TypeError
# Create a list just simply use
aList = [1, 2, 3]
# list(iterable) correct usage
aList = list( (1, 2, 3) )
aList = list( range(1,4) )
```
### Tuple
> 1. Tuple is a immutable object
> 2. Common usage is to store value
> 3. Can't insert value to the tuple and remove value from the tuple
### Dictionary
> 1. 使用key-value的方式儲存資料
> 2. 如同C++ hash map
> 3. key-value可以為任意型別
#### 1. Dictionary Function
- `dict(mapping)`:
- Return the dict of mapping
- EX:`dict([('one', 1) ,('two', 2)]) --> {'one': 1, 'two': 2}`
- `dict(**kwargs)`:
- EX:`dict(k1='A', k2='B') --> {'k1': 'A', 'k2': 'B'}`
- `[]`:
- Add the value to the key
- EX: `dict_obj[key] = value`
- Get the value of the key
- EX: `var = dict_obj[key]`
- If no key, raise KeyError
- `dict.update(**kwargs or dict_obj)`
- Add the value to the original dict_obj
- `dict.clear()`
- Remove all elems in the dict
- `dict.copy()`
- Return the copy of the dict
- `dict.get(key, default=None)`
- Return the value of the key
- If no key, return default
- EX:`dict.get(fun, lambda:print('no fun'))()`
- `dict.setdefault(key, default=None)`
- If the key set, then return the value of key
- If no key, then set *default* to key and return *default*
- If *default* not set, then set None to *default*
- `dict.keys()`
- Return a list of the key in dict
- `dict.values()`
- Return a list of the value in dict
- `dict.items()`
- Return a list of the key-value pair in dict
- `dict.pop(key, [default])`
- Return the value of the key, and pop the key from the dict
- If key isn't exist, return default
- If no default , raise KeyError
- `dict.__contain__(key)`
- Return True if key in the dict
- EX:`True if key in dict else False`
#### 2. Dictionary Example
```python=
# dict example with sorted and lambda
dic = {'Mary' : 50, 'Bob': 30, 'Cindy' : 80, 'John' : 100, 'Can' : 10}
# Sort by key
sort_by_key = sorted(dic.items(), key = lambda x:x[0])
## sort_by_key =
## [('Bob', 30), ('Can', 10), ('Cindy', 80), ('John', 100), ('Mary', 50)]
# Sort by value
sort_by_val = sorted(dic.items(), key = lambda x:x[1])
## sort_by_val =
## [('Can', 10), ('Bob', 30), ('Mary', 50), ('Cindy', 80), ('John', 100)]
# Sort with the second word of name and reverse
sort_ch = sorted(dic.items(), key = lambda x:x[0][1], reverse = True)
## sort_ch =
## [('Bob', 30), ('John', 100), ('Cindy', 80), ('Mary', 50), ('Can', 10)]
```
3. Dictionary Compresion
> Syntax: { key : value for ... in ... if ... }
Example
```python=
squre = { i : i*i for i in range(N) }
```