---
# System prepended metadata

title: 容器
tags: [python]

---

# 容器
###### tags: `python`
## 串列 List
今天媽咪請你去全聯買東西，你可以用程式把它記錄下來：
```python=
shoppingList = "雞蛋\n米酒\n"
shoppingList += "鮮奶\n" + "麵條\n"
print(shoppingList)
# output:
# 雞蛋
# 米酒
# 鮮奶
# 麵條
```
這樣看來似乎可行，但試想：
- 如果你要移除某一項？
- 如果這個清單增加到數百個，第24個東西是什麼？
- 總共有幾項商品需要買？

這時候我們可以使用「串列」：
```python=
shoppingList = ["雞蛋", "米酒", "鮮奶"]

# 增加項目
shoppingList.append("麵條")
print(shoppingList)
# output: ["雞蛋", "米酒", "鮮奶", "麵條"]

# 合併另一個串列
anotherList = ["洋芋片", "醬油"]
shoppingList += anotherList
print(shoppingList)
# output: ["雞蛋", "米酒", "鮮奶", "麵條", "洋芋片", "醬油"]
```
- 在第一行，我們用中括號來代表串列，並且每個項目用逗號隔開。
- 在第四行，如果要新增項目，我們可以用`append()`函數。
  這個函數是串列的函數，我們在這個串列後面加一個句號然後再接著函數。
- 在第九行我們新增另一個串列。並且在第十行把兩個串列加起來合併。

接著，如果我們想知道特定一個值，可以使用他的索引來找他。
在python中，索引從0開始：

```python=
shoppingList = ["雞蛋", "米酒", "鮮奶", "麵條", "洋芋片", "醬油"]
print(shoppingList[0])
# output: "雞蛋"
print(shoppingList[5])
# output: "醬油"
```

一些常用的方法：
```python=
shoppingList = ["雞蛋", "米酒", "雞蛋", "鮮奶", "麵條", "洋芋片", "醬油"]

# 更改特定位置的值
shoppingList[1] = "小米酒"
print(shoppingList)
# output: ["雞蛋", "小米酒", "雞蛋", "鮮奶", "麵條", "洋芋片", "醬油"]

# 計算特定值出現幾次
shoppingList.count("雞蛋")
# 2

# 回傳該值第一次出現的索引（沒有該值會出現錯誤）
shoppingList.index("雞蛋")
# 0

# 在特定索引插入值
shoppingList.insert(2,"奶油")
print(shoppingList)
# output: ["雞蛋", "米酒", "奶油", "雞蛋", "鮮奶", "麵條", "洋芋片", "醬油"]

# 刪除第一個出現的特定值
shoppingList.remove("雞蛋")
print(shoppingList)
# output: ["米酒", "奶油", "雞蛋", "鮮奶", "麵條", "洋芋片", "醬油"]

# 把整個串列反序
shoppingList.reverse()
print(shoppingList)
# output: ['醬油', '洋芋片', '麵條', '鮮奶', '雞蛋', '奶油', '米酒']

# 排序（字串的話是字典排序；數字的話是小到大）
shoppingList.sort()

# 查看某個值是否在該串列中
"醬油" in shoppingList
# True

"油" in shoppingList
# False

# 清除所有值
shoppingList.clear()
print(shoppingList)
# output: []
```


## Tuple
除了串列之外，也有其他的容器。初學這邊可以先跳過。
我們會用小括號來代表一個tuple，tuple的值是不可以更改的。
```python=
someTuple = (0,1,2,3,4,5)
someTuple[0] = 99
# TypeError: 'tuple' object does not support item assignment
```
### Unpack tuple
We can assgin some varibles by unpacking tuple:
```python=
myName, MyAge = ("Kyle", 25)
print(f'My name is {myName}. I\'m {MyAge} years old.')
# My name is Kyle. I'm 25 years old.
```
Now let's think a situaion that we need to swap two number:
```python=
# Ordinary way:
x, y = 1, 2
# define a temperary varible to store one of them.
temp = x
x = y
y = temp
print(f'x = {x}, y = {y}')
# x = 2, y = 1
```
With tech of unpacking tuple, we can easily do like this:
```python=
x, y = 1, 2
x, y = y, x
print(f'x = {x}, y = {y}')
# x = 2, y = 1
```
So simple right? Try it yourself!

## Dictionary
字典用大括號來表示，它是一個「`key`跟`value`」的對應：
```python=
introduction = {"外號": "高雄金城武", "身高": 183}
print(introduction["外號"])
# output: "高雄金城武"
```
`key` 在整個字典裡要是唯一的，不過`value`可以重複。就好像菜單每個餐的名字不會重複(key)，但金額可以重複(value)。
```python=
menu = {'1號餐':89, '2號餐':89}
```
除了直接用中括號來當作索引，我們也可以用`get`來取得內容。
用`get`的話，可以設定在找不到東西時的`default`預設值。
```python=
menu = {'1號餐':89, '2號餐':89}
print(menu.get('2號餐', '查詢不到餐點'))
# 89
print(menu.get('3號餐', '查詢不到餐點'))
# '查詢不到餐點'
```
查詢更多`dictionary`的用法
```python=
help(dict)
```
字典迭代(iteration)
```python=
menu = {'1號餐':89, '2號餐':89}
for meal, price in menu.items():
    print(f'{meal}:{price}元。')

# 1號餐:89元。
# 2號餐:89元。
```
[用 Dictionary 做文字RPG](/H4F7mOEjThCkmIUh4ANMvQ)

## Set
Todo...