2016-02-14 80 views
2

我有3個表:合併幾個列表到字典

a = ["John", "Archie", "Levi"] 
b = ["13", "20"] 
c = ["m", "m", "m", "m"] 

我想用字典合併成一個列表如下:

result = [ 
{"name": "John", "age": "13", "gender": "m"}, 
{"name": "Archie", "age": "20", "gender": "m"}, 
{"name": "Levi", "age": "", "gender": "m"}, 
{"name": "", "age": "", "gender": "m"}, 
    ] 
+0

你的邏輯是沒有意義的。你打算如何決定誰將會20歲 –

+1

@LeoDabus對我有意義。 OP只是使用數組的順序來確定。例如'{姓名:a0,年齡:b0,性別:c0},{姓名:a1,年齡:b1,性別:c1} ...' – Hamish

回答

3

嘗試這樣的:

let a = ["John", "Archie", "Levi"] 
let b = ["13", "20"] 
let c = ["m", "m", "m", "m"] 


var dicArray:[[String:String]] = [] 

for index in 0..<max(a.count,b.count,c.count) { 
    dicArray.append([:]) 
    dicArray[index]["name"] = index < a.count ? a[index] : "" 
    dicArray[index]["age"] = index < b.count ? b[index] : "" 
    dicArray[index]["gender"] = index < c.count ? c[index] : "" 
} 

dicArray // [["gender": "m", "age": "13", "name": "John"], ["gender": "m", "age": "20", "name": "Archie"], ["gender": "m", "age": "", "name": "Levi"], ["gender": "m", "age": "", "name": ""]] 
4

好吧,這是非常正常的計算機科學問題。這裏是如何去解決它的輪廓:

  1. 首先,確定輸入和所需的輸出。你已經做到了。
  2. 請注意您需要處理的任何邊緣情況
  3. 接下來,使用僞代碼映射出邏輯流。
  4. 從僞代碼轉換爲真實代碼。
  5. 測試和調試。

對於第2步,您的數據表明您想要處理每個源陣列中元素數量不同的情況。它看起來像是要爲每個數組中的所有0個元素創建一個字典,然後爲1個元素創建一個字典等。當您用完給定數組的元素時,它看起來像要跳過您的鍵產生字典輸入。

我們的僞代碼:

Find the array with the maximum number of elements. Make this your output_count (the number of items in your output array.) 
Create an output array large enough for output_count entries. 
Loop from 0 to output_count - 1. 
    create a dictionary variable 
    for each input array, if there are enough elements, add a key/value pair 
    for that array's key and the value at the current index. Otherwise skip 
    that key. 
    add the new dictionary to the end of your output array. 

這應該足以讓你開始。現在看看您是否可以將該僞代碼轉換爲實際代碼,進行測試並進行調試。如果您的代碼無法正常工作,請返回此處並附上您的實際代碼,並隨時尋求幫助。

2

這是我服用。我首先創建陣列,然後用enumerate()forEach來處理每個陣列並將其添加到詞典的數組:

let a = ["John", "Archie", "Levi"] 
let b = ["13", "20"] 
let c = ["m", "m", "m", "m"] 

let count = max(a.count, b.count, c.count) 

var result = Array(count: count, repeatedValue: ["name":"", "age":"", "gender":""]) 

a.enumerate().forEach { idx, val in result[idx]["name"] = val } 
b.enumerate().forEach { idx, val in result[idx]["age"] = val } 
c.enumerate().forEach { idx, val in result[idx]["gender"] = val } 

print(result) 

[[「性別」:「M」,「年齡」:「13 「,」性別「:」m「,」年齡「: 」20「,」姓名「:」Archie「],[」性別「:」m「 : 「」, 「名」: 「李維斯」], [ 「性別」: 「M」, 「年齡」: 「」, 「名」: 「」]]

2

這應該做的工作

let maxLength = max(a.count, b.count, c.count) 
let paddedA = a + [String](count: maxLength-a.count, repeatedValue: "") 
let paddedB = b + [String](count: maxLength-b.count, repeatedValue: "") 
let paddedC = c + [String](count: maxLength-c.count, repeatedValue: "") 

let res = zip(paddedA, zip(paddedB, paddedC)).map { 
    ["name": $0.0, "age": $0.1.0, "gender": $0.1.1] 
} 

輸出

[["gender": "m", "age": "13", "name": "John"], ["gender": "m", "age": "20", "name": "Archie"], ["gender": "m", "age": "", "name": "Levi"], ["gender": "m", "age": "", "name": ""]] 
+1

Swift的優雅使用,但是這看起來像是「給男人一條魚「時刻。對於像這樣的初學者問題,我認爲提供代碼實際上適得其反。我選擇解釋*如何解決問題,而不是提供現成的解決方案。 –

+0

嗨@DuncanC,你提供了非常詳細的答案!我認爲這個頁面中的所有答案不僅對OP而且對未來的讀者都有用。關於我,我只是提供了函數式編程的觀點:) –

+0

但如果我將有更多的3個數組?那麼該怎麼辦? zip(zip(zip)))? – Arti