2016-05-08 41 views
1

在Python我可以創建一個重複列表如下:重複陣列中的斯威夫特

>>> [1,2,3]*3 
[1, 2, 3, 1, 2, 3, 1, 2, 3] 

有一種簡潔的方式在斯威夫特做到這一點?

我能做的最好的是:

1> var r = [Int]() 
r: [Int] = 0 values 
    2> for i in 1...3 { 
    3.  r += [1,2,3] 
    4. } 
    5> print(r) 
[1, 2, 3, 1, 2, 3, 1, 2, 3] 

回答

5

您可以創建一個二維數組,然後用flatMap把它變成一維數組:

let array = [Int](repeating: [1,2,3], count: 3).flatMap{$0} 

這是一個擴展,它增加了一個init方法和一個重複方法,該方法需要一個數組,使其更清潔一些:

extension Array { 
    init(repeating: [Element], count: Int) { 
    self.init([[Element]](repeating: repeating, count: count).flatMap{$0}) 
    } 

    func repeated(count: Int) -> [Element] { 
    return [Element](repeating: self, count: count) 
    } 
} 

let array = [1,2,3].repeated(count: 3) // => [1, 2, 3, 1, 2, 3, 1, 2, 3] 

注意與新初始化,如果你使用它沒有提供預期的類型,你可以得到一個模糊的方法調用:

let array = Array(repeating: [1,2,3], count: 3) // Error: Ambiguous use of ‛init(repeating:count:)‛ 

使用,而不是:

let array = [Int](repeating: [1,2,3], count: 3) // => [1, 2, 3, 1, 2, 3, 1, 2, 3] 

let array:[Int] = Array(repeating: [1,2,3], count: 3) // => [1, 2, 3, 1, 2, 3, 1, 2, 3] 
+1

您需要將count參數類型更改爲Int,以將其用作從Uint到Int的索引或脅迫self.init([Array](count:Int(count),repeatedValue:repeatedValues).flatMap {$ 0})' –

+1

啊,是的,事實證明,當我測試它時,我使用的代碼略微不同於我在這裏發佈的代碼。我改變它以更好地匹配原始的'init'方法。 – ColGraff

0

解決方案1:

func multiplerArray(array: [Int], time: Int) -> [Int] { 
    var result = [Int]() 
    for _ in 0..<time { 
     result += array 
    } 
    return result 
} 

調用此

print(multiplerArray([1,2,3], time: 3)) // [1, 2, 3, 1, 2, 3, 1, 2, 3] 

解決方案2:

let arrays = Array(count:3, repeatedValue: [1,2,3]) 
// [[1, 2, 3], [1, 2, 3], [1, 2, 3]] 
var result = [Int]() 
for array in arrays { 
    result += array 
} 
print(result) //[1, 2, 3, 1, 2, 3, 1, 2, 3] 
4

可以使用模運算爲你的基地收集和函數式編程的指數計算的是:

let base = [1, 2, 3] 
let n = 3 //number of repetitions 
let r = (0..<(n*base.count)).map{base[$0%base.count]} 

您可以創建爲*運營商定製的過載,它接受左側的陣列和一個整數在右側。

func * <T>(left: [T], right: Int) -> [T] { 
    return (0..<(right*left.count)).map{left[$0%left.count]} 
} 

然後,您可以使用您的功能就像在Python:

[1, 2, 3] * 3 
// will evaluate to [1, 2, 3, 1, 2, 3, 1, 2, 3] 
+0

非常酷!不過,我想從Swift中實現Python語法開始。代碼可讀性可能不好。 – Imran