我有字典:
CodonDict = {'ATT':'I', 'ATC':'I', 'ATA':'I', 'CTT':'L', 'CTC':'L',...}这本词典继续为64个其它独特的三联体编纂。
我在迭代一个文本文件,它本质上是一个巨大的字符串。我的代码现在用从0到63的64个键更新空字典:
TripletCount = {0: 18626, 1: 9187, 2: 9273, 3: 9154, 4: 37129, 5: 36764, 6: 18468,...},值为三联体的频率(但键为整数)。
TripletCount = {}
我想使用CodonDict的值作为TripletCount中的键,键的频率作为TripletCount中的值。
我以前用过python编程,但是格式化字典从来都不是我的强项。
不过,我正在迭代的数据文件本质上是这样的:
'GTGGCTTCTCTTCTCCACTCCTCTTTTTATTCCTTCCCAAACAAGAAGGTTAGTTATTATTATTTCCAGA...'
编辑:
我想得到的一个例子;
TripletCount = {'I': 18626, 'V': 9187, 'L': 9273, 'Y': 9154, 'E': 37129,...}
编辑2:
根据要求:我计划通过在列表中添加计数来解决关键冲突,因为不同类型的碱基对可以识别相同的氨基酸,所以{'I': [18626, 9187, 9154], ...}。
- 你能加一个你想要的结果的例子吗?
- 当然可以:TripletCount = {'I': 18626, 'V': 9187, 'L': 9273, 'Y': 9154,...}。
- 至于我,你现在很难改变你的口述。相反,您可以尝试在DNA字符串的解析过程中插入密码子作为密钥。您还可以添加生成TripletCountdict的代码吗?
- 您的CodonDict的示例值不是唯一的,所以当这些值成为键时,您打算如何解决键冲突?
- @oleksander这就是我想知道如何做的,有没有一种方法可以"附加"值作为另一个dict中的键?另一个dict确保基对(如aat等)仍然指示另一个字典中键的频率,如果这有意义的话?
- @这就是问题所在,如果有一种方法只使用一本字典,我会更喜欢它,但我能想到的唯一方法就是硬编码。
- 解决关键冲突的两种典型方法是:1)汇总计数(所以{'I': 18626 + 9187 + 9154, ...),2)将计数转换为列表(所以{'I': [18626, 9187, 9154], ...}),请在做出决定后更新您的问题,说明您计划如何解决关键冲突。
- @SeabassGoslin可以使用类似于{"ATT": {"acid":"I","frequency": 18626}, ...}的结构。
- @Blhsing将使用您的第二种方法,将计数转换成一个列表,因为不同的碱基对可以用来识别一个氨基酸(新的键),所以{'I': [18626, 9187, 9154], ...}。
键在字典中是唯一的,因此在TripletCount中,每个值都等于1。
如果我误解了你的问题,请纠正我。
下面的代码可以通过使用defaultdict的defaultdict来解决您的问题
1 2 3 4 5 6 7 8 9
| from collections import defaultdict as ddict
CodonDict = {'ATT':'I', 'ATC':'I', 'ATA':'I', 'CTT':'L', 'CTC':'L'}
TripletCount = ddict(lambda:ddict(int))
for key,value in CodonDict.items():
TripletCount[value][key] += 1 |
TrpletCount中的值是defaultdict,您可以通过类似map的方法将其转换为列表。
您可以迭代您的数据,一次查看三个连续字符,并检查三个字符的每个字符串是否是您的CodonDict字典中的键。如果是,可以增加EDOCX1的值(1)。
例如,使用问题中的示例数据集:
1 2 3 4 5 6 7 8 9 10 11
| CodonDict = {'ATT':'I', 'ATC':'I', 'ATA':'I', 'CTT':'L', 'CTC':'L'}
TripletCount = {}
data = 'GTGGCTTCTCTTCTCCACTCCTCTTTTTATTCCTTCCCAAACAAGAAGGTTAGTTATTATTATTTCCAGA'
for i in range(3, len(data)): # iterates through your data string
triplet = CodonDict.get(data[i-3:i]) # check if the next 3 characters in a row are a key in CodonDict
if triplet: # if it is a key: increment the count of its value by one
TripletCount[triplet] = TripletCount.get(triplet, 0) + 1
print(TripletCount)
{'I': 4, 'L': 8} |
- 哇,谢谢,这否定了我花在这上面的两天,它起作用了!再次感谢!
- 你也可以使用计数器,据报道,它是更快的计数事物,而不是常规字典+1方法。
- @Arjoonn你可以使用Counter,但我不确定在这种情况下这会给你带来多少好处,因为你仍然需要迭代data字符串。您可以执行类似于Counter(CodonDict.get(data[i-3:i]) for i in range(3, len(data)))的操作,然后删除/忽略None键。