<jupyter_start><jupyter_text>集合 (Collection) 型別：元組 (Tuple) 、Pair、字典 (Dict)、與 Set除了之前介紹的陣列 (Array) 之外，還有其他重要及常見的集合型別。以下的內容將介紹的是 Julia 的幾種集合 (Collection) 型別：- 元組(Tuple)- Pair- 字典(Dict) - Set  1. 元組 (Tuple) 1.1 元組的建立元組的建立是使用小括號和逗號分隔的元素，可以是由不同型別的元素組成。元組是不可變的 (immutable)，所以建立後元素值是不能被改變的，也無法再增加元素。<jupyter_code>a = (1, "2", 3.0)<jupyter_output><empty_output><jupyter_text>單一元素的元組，元素後仍然要帶逗號，要不然型別不會被判定為元組。<jupyter_code>b = (1,)
typeof(b)
c = (2)
typeof(c)<jupyter_output><empty_output><jupyter_text>也可以用建構子建立元組<jupyter_code>Tuple((1, 2, 3))<jupyter_output><empty_output><jupyter_text>1.2 元組的索引與命名元組命名元組 (Named Tuple) 是另一種形式的元組，可給予名稱給每個元素，例如：tupleA = (a = 1, b = 2, c = 3)。存取命名元組內的元素值時，除了可以用索引值外，也以透過名稱取得，例如：tupleA[3] 及 tupleA.c 均是取得第 3 個元素值。元組的索引值也是從 1 開始而非 0。<jupyter_code>tupleA = (a = 1, b = 2, c = 3)
tupleA.c
tupleA[3]<jupyter_output><empty_output><jupyter_text>1.3 元組的遍歷 (Traversal)要列出元組中所有元素值，可以透過索引或是迭代的方式。<jupyter_code>for i ∈ tupleA
    println(i)
end
for i = 1:lastindex(tupleA)
    println(tupleA[i])
end<jupyter_output>1
2
3<jupyter_text>1.4 元組的組合在建立元組時，可以將已有的元組透過 “…” 運算子展開到新的元組中，但特別要注意的是 “…” 後要帶逗號，否則會產生錯誤。<jupyter_code>d = (1, "2", 3.0)
e = (d..., 1, 2, 3)
# tuple in tuple
(d, 1, 2, 3)<jupyter_output><empty_output><jupyter_text>2. Pair 2.1 Pair 的建立Pair 型別是用來建立 key / value 兩種物件對應的型別，Pair 也是不可變的 (immutable)。Pair 的建立可以透過建構子或是 key=>value 語法建立。<jupyter_code># 透過 Pair constructor 建立
a = Pair("key1", 1)
# 透過 key=>value 語法建立 Pair
a = "key1"=>1<jupyter_output><empty_output><jupyter_text>2.2 Pair的索引取得 Pair 的 key 及 value，可以透過索引或是 first / second 成員。<jupyter_code># 透過索引取得 key 及 value
println(a[1])
println(a[2])
# 透過 first 及 second 取得 key 及 value
println(a.first)
println(a.second)<jupyter_output>key1
1<jupyter_text>3. 字典 (Dict) 3.1 字典的建立字典的建立與前述的 Pair 非常類似，宣告 key=>value 對應。字典元素是沒有順序的。<jupyter_code>Dict(1=>1, 2=>"2", 3=>3.0)<jupyter_output><empty_output><jupyter_text>在建立字典時，也可以明確宣告型別。<jupyter_code>Dict{Int64,Float64}(1=>1, 2=>3.5, 3=>3.0)<jupyter_output><empty_output><jupyter_text>下面的例子是將 Pair 放入字典。<jupyter_code>a = Pair("key1", 1)
Dict(a)<jupyter_output><empty_output><jupyter_text>3.2 字典的索引字典的索引值就是各元素的 key 值，要存取得對應的元素值時可以使用 d[key值] 存取。<jupyter_code>d = Dict("key1"=>1, "key2"=>"2", 3=>3.0)
println(d["key1"])
println(d["key2"])
println(d[3])<jupyter_output>1
2
3.0<jupyter_text>透過 `get()` 函式也可以取得對應的元素值。<jupyter_code>get(d, "key1", 1)<jupyter_output><empty_output><jupyter_text>字典是可變的 (mutable)，透過索引可以變更字典元素的值。<jupyter_code>d["key2"] = 2.2
d<jupyter_output><empty_output><jupyter_text>3.3 字典 (Dict) 的遍歷 (Traversal)要知道字典中有多少個元素 (key 及其對應值)，可以透過 2 種方式：- `length()` 函式- 字典的 count 成員<jupyter_code>d = Dict("key1"=>1, "key2"=>"2", 3=>3.0)
length(d)
d.count<jupyter_output><empty_output><jupyter_text>透過 `keys()` 函式，列出所有 key 值。<jupyter_code>keys(d)
for k in keys(d)
    println(k)
end<jupyter_output>key2
3
key1<jupyter_text>透過 `values()` 函式，列出所有元素值。<jupyter_code>values(d)<jupyter_output><empty_output><jupyter_text>配合 `collect()` 函式，可以將所有的 value 轉為陣列。<jupyter_code>collect(values(d))<jupyter_output><empty_output><jupyter_text>3.4 字典 (Dict) 的加入或剔除元素要加入元素到字典中，只要指定一個新的 key 及其對應值，就可以自動將其加入到字典中。<jupyter_code>d = Dict("key1"=>1, "key2"=>"2", 3=>3.0)
d["new key"] = 4
d<jupyter_output><empty_output><jupyter_text>呼叫 `delete!()` 函式刪除某個 key 及其對應值。<jupyter_code>delete!(d, "new key")
delete!(d, "key2")<jupyter_output><empty_output><jupyter_text>也可以呼叫 `pop!()` 函式刪除某個 key 及其對應值同時取出該對應值。<jupyter_code>pop!(d, 3)
d<jupyter_output><empty_output><jupyter_text>4. Set 4.1 Set 的建立Set 建立時，需要透過建構子 (constructor)，將其他集合型別 (例如陣列或元組) 以參數傳給建構子。Set 有幾個特性：- Set 元素是沒有順序的。- Set 中的元素不重覆，如果重覆的話只會保留一個。<jupyter_code># 使用陣列
Set([1, 2, 3, 4, 5, 5, 6])
# 使用元組
Set((1, 2, 3, 4, 5, 5, 6))<jupyter_output><empty_output><jupyter_text>4.2 Set 常用函式<jupyter_code>a = Set([1, 2, 3, 4, 5])
b = Set([1, 3, 5])<jupyter_output><empty_output><jupyter_text>`union()`：2 個 Set 的聯集<jupyter_code>union(a, b)<jupyter_output><empty_output><jupyter_text>`intersect()`：2 個 Set 的交集<jupyter_code>intersect(a, b)<jupyter_output><empty_output><jupyter_text>`setdiff()`：2 個 Set 的差異<jupyter_code>setdiff(a, b)<jupyter_output><empty_output><jupyter_text>2 個 Set 的關係判斷，a set 是否為 b set 的子集。也可以使用 ⊆ 運算符號。<jupyter_code>issubset(a, b)
issubset(b, a)
# issubset 可以使用 ⊆ 運算符號，其 LaTeX 語法為 \subseteq
b ⊆ b<jupyter_output><empty_output><jupyter_text>`isempty()`：判斷 Set 是否為空<jupyter_code>isempty(a)<jupyter_output><empty_output><jupyter_text>`empty!()`：清除 Set 中所有元素，也可以用於元組、陣列、字典。<jupyter_code>empty!(a)
a<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1708733526915345, 'fraction_numerical': 0.03506812597721689, 'mean_word_length': 9.816425120772946, 'pattern_counts': {'":': 0, '<': 113, '<?xml version=': 0, '>': 132, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '29', 'dir': 'jupyter-structured-clean-dedup', 'id': '325897', 'license': 'Apache-2.0', 'n_tokens_mistral': 2803, 'n_tokens_neox': 2890, 'n_words': 324, 'path': 'example/julia_010_example.ipynb', 'repo_name': 'h164654156465/1st-JuliaMarathon', 'size': '4477'}