Swift 迅捷4。词典合并

Swift 迅捷4。词典合并,swift,dictionary,random,swift4,Swift,Dictionary,Random,Swift4,有个问题。有两本钥匙相同的字典。我需要将它们连接起来,从每个字典中随机获得一半的值 提前感谢您的回答 var hiraganaDictionary1 = [ "a":"あ", "i":"い", "u":"う", "e":"え", "o":"お", "A":"あ", "I":"い", "U":"う", "E":"え", "O":"お", "ka":"か", "ki":"き", "ku":"く", "ke":"け", "ko":"こ", "Ka":"か", "Ki":"き", "Ku":"く", "

有个问题。有两本钥匙相同的字典。我需要将它们连接起来,从每个字典中随机获得一半的值

提前感谢您的回答

var hiraganaDictionary1 = [
"a":"あ", "i":"い", "u":"う", "e":"え", "o":"お",
"A":"あ", "I":"い", "U":"う", "E":"え", "O":"お",
"ka":"か", "ki":"き", "ku":"く", "ke":"け", "ko":"こ",
"Ka":"か", "Ki":"き", "Ku":"く", "Ke":"け", "Ko":"こ",
"sa":"さ", "shi":"し", "su":"す", "se":"せ", "so":"そ",
"Sa":"さ", "Shi":"し", "Su":"す", "Se":"せ", "So":"そ",
"ta":"た", "chi":"ち", "tsu":"つ", "te":"て", "to":"と",
"Ta":"た", "Chi":"ち", "Tsu":"つ", "Te":"て", "To":"と",
"na":"な", "ni":"に", "nu":"ぬ", "ne":"ね", "no":"の",
"Na":"な", "Ni":"に", "Nu":"ぬ", "Ne":"ね", "No":"の"]


var katakanaDictionary1 = [
"a":"ア", "i":"イ", "u":"ウ", "e":"エ", "o":"オ",
"A":"ア", "I":"イ", "U":"ウ", "E":"エ", "O":"オ",
"ka":"カ", "ki":"キ", "ku":"ク", "ke":"ケ", "ko":"コ",
"Ka":"カ", "Ki":"キ", "Ku":"ク", "Ke":"ケ", "Ko":"コ",
"sa":"サ", "shi":"シ", "su":"ス", "se":"セ", "so":"ソ",
"Sa":"サ", "Shi":"シ", "Su":"ス", "Se":"セ", "So":"ソ",
"ta":"ソ", "chi":"チ", "tsu":"ツ", "te":"テ", "to":"ト",
"Ta":"ソ", "Chi":"チ", "Tsu":"ツ", "Te":"テ", "To":"ト",
"na":"ナ", "ni":"ニ", "nu":"ヌ", "ne":"ネ", "no":"ノ",
"Na":"ナ", "Ni":"ニ", "Nu":"ヌ", "Ne":"ネ", "No":"ノ" ]
合并:uniquingKeysWith:使用决定如何处理冲突的函数。您可以使用该函数在字典之间随机选择

let merged = hiraganaDictionary1.merging(katakanaDictionary1,
                                         uniquingKeysWith: { first, second in
                                            Bool.random() ? first : second })
合并:uniquingKeysWith:使用决定如何处理冲突的函数。您可以使用该函数在字典之间随机选择

let merged = hiraganaDictionary1.merging(katakanaDictionary1,
                                         uniquingKeysWith: { first, second in
                                            Bool.random() ? first : second })

因为您希望每个现有键都有一个值,所以可以使用Bool.random来确定从哪个字典中选择值

var combined = [String:String]()
hiraganaDictionary1.keys.makeIterator().forEach {
    combined[$0] = Bool.random() ? hiraganaDictionary1[$0] : katakanaDictionary1 [$0]
}
这里有一个替代方案,每第二轮使用Bool.random,每隔一轮使用与最后一次调用Bool.random相反的调用,这将从每个字典中获取50%

var combined = [String:String]()
var flag = true
var randomFlag: Bool
hiraganaDictionary1.keys.makeIterator().forEach {
    if (!flag) {
        combined[$0] = !randomFlag ? hiraganaDictionary1[$0] : katakanaDictionary1 [$0]
    } else {
        randomFlag =  Bool.random()
        combined[$0] = randomFlag ? hiraganaDictionary1[$0] : katakanaDictionary1 [$0]
    }
    flag = !flag
}

因为您希望每个现有键都有一个值,所以可以使用Bool.random来确定从哪个字典中选择值

var combined = [String:String]()
hiraganaDictionary1.keys.makeIterator().forEach {
    combined[$0] = Bool.random() ? hiraganaDictionary1[$0] : katakanaDictionary1 [$0]
}
这里有一个替代方案,每第二轮使用Bool.random,每隔一轮使用与最后一次调用Bool.random相反的调用,这将从每个字典中获取50%

var combined = [String:String]()
var flag = true
var randomFlag: Bool
hiraganaDictionary1.keys.makeIterator().forEach {
    if (!flag) {
        combined[$0] = !randomFlag ? hiraganaDictionary1[$0] : katakanaDictionary1 [$0]
    } else {
        randomFlag =  Bool.random()
        combined[$0] = randomFlag ? hiraganaDictionary1[$0] : katakanaDictionary1 [$0]
    }
    flag = !flag
}
Bool.random并不能保证每本字典都有一半的键。作为一个简单的测试:

var bool = Bool.random()
var count = 0
for _ in 1...100 {
    if bool { count += 1 }
    bool = Bool.random()
}

print(count)
这可能会产生53、61、57。。。多次运行

如果要确保从每个字典中随机获得一半的值,则可以观察到两个字典具有相同的键,因此计数和do相同:

var mergedDict = [String : String].init(minimumCapacity: hiraganaDictionary1.count)

var bool = Bool.random()

let keys = hiraganaDictionary1.keys.shuffled()

for key in keys {
    mergedDict[key] = bool ? hiraganaDictionary1[key] : katakanaDictionary1[key]
    bool.toggle()
}
请注意,这些键在使用前已被洗牌。否则,在对它们进行迭代时,键的出现顺序与它们在字典的键-值对中出现的顺序相同,这可能是有偏差的。也就是说,它可以预先确定来自任一词典的哪些键将出现在结果词典中

洗牌键的更有效方法是洗牌索引:

var mergedDict = [String : String].init(minimumCapacity: hiraganaDictionary1.count)

var bool = Bool.random()

let indices = hiraganaDictionary1.keys.indices.shuffled()

for index in indices {
    let key = hiraganaDictionary1.keys[index]
    mergedDict[key] = bool ? hiraganaDictionary1[key] : katakanaDictionary1[key]
    bool.toggle()
}
Bool.random并不能保证每本字典都有一半的键。作为一个简单的测试:

var bool = Bool.random()
var count = 0
for _ in 1...100 {
    if bool { count += 1 }
    bool = Bool.random()
}

print(count)
这可能会产生53、61、57。。。多次运行

如果要确保从每个字典中随机获得一半的值,则可以观察到两个字典具有相同的键,因此计数和do相同:

var mergedDict = [String : String].init(minimumCapacity: hiraganaDictionary1.count)

var bool = Bool.random()

let keys = hiraganaDictionary1.keys.shuffled()

for key in keys {
    mergedDict[key] = bool ? hiraganaDictionary1[key] : katakanaDictionary1[key]
    bool.toggle()
}
请注意,这些键在使用前已被洗牌。否则,在对它们进行迭代时,键的出现顺序与它们在字典的键-值对中出现的顺序相同,这可能是有偏差的。也就是说,它可以预先确定来自任一词典的哪些键将出现在结果词典中

洗牌键的更有效方法是洗牌索引:

var mergedDict = [String : String].init(minimumCapacity: hiraganaDictionary1.count)

var bool = Bool.random()

let indices = hiraganaDictionary1.keys.indices.shuffled()

for index in indices {
    let key = hiraganaDictionary1.keys[index]
    mergedDict[key] = bool ? hiraganaDictionary1[key] : katakanaDictionary1[key]
    bool.toggle()
}

可能重复的可能重复最好使用方法,而不是只在一个字典的循环中迭代。@user28434由Rob完成:-。如果由于某种原因,两个字典中都不存在该键,则该值将丢失。。。最糟糕的是,它是随机丢失的。好吧,当我写评论时,罗伯·纳皮尔的回答完全不同。是的,我最初误解了这个问题,写了关于合并两个半字典的文章。我没有注意到键应该是相同的,我想到的是两组独立的键。最好使用方法,而不是只在一个字典的循环中进行迭代。@user28434由Rob完成:-。如果由于某种原因,两个字典中都不存在该键,则该值将丢失。。。最糟糕的是,它是随机丢失的。好吧,当我写评论时,罗伯·纳皮尔的回答完全不同。是的,我最初误解了这个问题,写了关于合并两个半字典的文章。我忽略了一点,那就是钥匙应该是一样的,我想到的是两套独立的钥匙。