具有单个值的多个键的字典 - Swift

时间:2016-04-26 01:10:37

标签: swift dictionary

我试图创建一个应用程序,根据预定的映射,将英文字母映射到各种RNA密码子(A,C,U或G的序列,每组3个)。

要将英语转换为RNA,字典如下所示:

var englishTomRNA: [Character: [String]] = ["A": ["UUU", "UAC"],
                                            "Q": ["UUA"],
                                            "S": ["UCU", "UCC", "UCA"]]

正如您所看到的,任何给定的英文字符都有多个值(代表多基因型的生物学特征),其中我没有问题转换为。

然而,我所遇到的问题是要翻译另一种方式的词典。我最初使用switch: case语句如下:

    for codon in preEnglishInputString {
        switch codon {
            case "UUU", "UAC":               inEnglish.append("A")
            case "UUA":                      inEnglish.append("Q")
            case "UCU", "UCC", "UCA", "UCG": inEnglish.append("S")
        }
    }

然而,现在我希望转换RNA - >英语转换功能使用词典更加符合此实现。

我无法弄清楚如何为单个值设置多个键(如上所述,单个键具有多个值的相反方向。)

以下内容在尝试时无效:

let mRNAtoEnglish: [[String] : Character] =
                                            [["UUU", "UAC"]       : "A",
                                            ["UUA", "UUG"]        : "Q",
                                            ["UCU", "UCC", "UCA"] : "S"]

编译器大喊Type [String] does not conform to protocol 'Hashable'

我只是使用错误的数据结构,还是有一些我不知道的语法? (我对Swift来说相当新鲜)

谢谢!

3 个答案:

答案 0 :(得分:4)

您不能将数组用于Dictionary键。钥匙是独一无二的相同的键不能在字典中出现两次,但不同的键可能指向相同的值。所有键必须属于同一类型,并且所有值必须属于同一类型。

正如Leo所评论的那样,保存3个具有相同值的键而不是具有3个键的单个数组:

let mRNAtoEnglish: [String : Character] =
    ["UUU": "A",
     "UAC": "A",
     "UUA": "Q",
     "UUG": "Q",
     "UCU": "S",
     "UCC": "S",
     "UCA": "S"]

答案 1 :(得分:1)

使用Swift的高阶函数:

var englishTomRNA: [Character: [String]] = ["A": ["UUU", "UAC"],
                                            "Q": ["UUA"],
                                            "S": ["UCU", "UCC", "UCA"]]
var inEnglish = ""

// Sample Input
let preEnglishInputString = ["UUA", "UCC", "UUU"]

for codon in preEnglishInputString {
    let english = englishTomRNA
                        .filter { $0.1.contains(codon) }
                        .first!.0
    inEnglish.append(english)
}

print(inEnglish) // QSA

这有两个假设:

  1. 每个密码子代码都映射到1个英文字符
  2. preEnglishInputString中的每个密码子代码都有效,可以在englishTomRNA词典中找到。
  3. 它的作用:

    .filter { ... }找到包含codon的任何键值对。当您在词典上调用filter时,它会退化为(key, value)的元组,因此$0.1引用valuefilter总是返回一个匹配数组,即使它只找到一个匹配项。

    first!从列表中获得第一个匹配(假设1)。感叹号假定总是找到匹配(假设2)。

    .0获取键值对的键,即英文字符。

答案 2 :(得分:1)

如果你想要一个基于字典的答案,这将产生size_type的反转版本。

englishTomRNA