我试图创建一个应用程序,根据预定的映射,将英文字母映射到各种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来说相当新鲜)
谢谢!
答案 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
这有两个假设:
preEnglishInputString
中的每个密码子代码都有效,可以在englishTomRNA
词典中找到。 .filter { ... }
找到包含codon
的任何键值对。当您在词典上调用filter
时,它会退化为(key, value)
的元组,因此$0.1
引用value
。 filter
总是返回一个匹配数组,即使它只找到一个匹配项。
first!
从列表中获得第一个匹配(假设1)。感叹号假定总是找到匹配(假设2)。
.0
获取键值对的键,即英文字符。
答案 2 :(得分:1)
如果你想要一个基于字典的答案,这将产生size_type
的反转版本。
englishTomRNA