使用字典的值作为另一个字典的键,并以键的频率作为值,Python 3.6

时间:2018-10-02 01:27:05

标签: python python-3.x dictionary

我有字典:

CodonDict = {'ATT':'I', 'ATC':'I', 'ATA':'I', 'CTT':'L', 'CTC':'L',...}该词典可用于其他64个唯一的三元组。

我正在遍历一个基本上是一个巨型字符串的文本文件。我的代码现在使用64个条目更新空字典,键的范围是0到63:

TripletCount = {0: 18626, 1: 9187, 2: 9273, 3: 9154, 4: 37129, 5: 36764, 6: 18468,...},其值是三元组的频率(但是密钥是整数)。

TripletCount = {}

我想将CodonDict values 用作TripletCount中的密钥,并将密钥的频率用作TripletCount中的值。

我以前用python编程,但是格式化字典从来都不是我的强项。

尽管我正在迭代的数据文件本质上看起来像这样:

'GTGGCTTCTCTTCTCCACTCCTCTTTTTATTCCTTCCCAAACAAGAAGGTTAGTTATTATTATTTCCAGA...'

编辑:

我想要得到的例子;

TripletCount = {'I': 18626, 'V': 9187, 'L': 9273, 'Y': 9154, 'E': 37129,...}

编辑2:

根据要求:我计划通过将计数添加到列表中来解决关键冲突,因为不同类型的碱基对可以识别相同的氨基酸,因此{'I': [18626, 9187, 9154], ...}

2 个答案:

答案 0 :(得分:0)

您可以遍历数据,一次查看三个连续的字符,并检查三个字符的每个字符串是否是CodonDict词典中的键。如果是,则可以增加TripletCount的值。

例如,使用问题中的样本数据集:

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 :(得分:0)

键在字典中是唯一的,因此在TripletCount中,每个值都将等于1
如果我误解了您的问题,请纠正我。

以下代码可以通过使用defaultdict的defaultdict

解决您的问题
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之类的值将其转换为列表。