Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用一个字典的值作为另一个字典中的键,使用键的频率作为值,Python 3.6_Python_Python 3.x_Dictionary - Fatal编程技术网

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

使用一个字典的值作为另一个字典中的键,使用键的频率作为值,Python 3.6,python,python-3.x,dictionary,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={'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
值作为
TripletCount
中的键,键的频率作为
TripletCount
中的值

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

我正在迭代的数据文件基本上如下所示:

'gtggcttcttctccatcctttttctttcctccaaacaagagaggttattattatttccaga…'

编辑:

我想得到的一个例子

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

编辑2:


根据请求:我计划通过将计数添加到列表中来解决密钥冲突,因为不同类型的碱基对可以识别相同的氨基酸,因此,
{'I':[1862691879154],…}

您可以遍历数据,一次查看三个连续字符,并检查三个字符的每个字符串是否是
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}

键在字典中是唯一的,因此在
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

的方式将它们转换为列表,您可以添加一个您想要的结果示例吗?当然可以:
TripletCount={'I':18626,'V':9187,'L':9273,'Y':9154,}
至于我,现在很难转换您的dict。相反,您可以尝试在解析DNA字符串期间插入密码子作为键。您还可以添加生成
TripletCount
dict的代码吗?您的
CodonDict
示例值不是唯一的,因此,当这些值成为键时,您计划如何解决键冲突?@Oleksander这就是我想知道的方法,有没有办法将这些值作为键“附加”到另一个dict中?当另一个dict确保碱基对(如AAT等)仍然在另一个dict中指定键的频率时,如果这有意义的话?哇,谢谢你,这否定了我花在这两天的时间,它起作用了!!再次感谢!你也可以使用据说比常规字典+1方法快得多的方法来计算东西。@Arjoon你可以使用
计数器
,但我不确定在这种情况下这能给你带来多少,因为你仍然需要迭代
数据
字符串。您可以对范围(3,len(data))中的i执行类似于
计数器(CodonDict.get(data[i-3:i])的操作
,然后删除/忽略
None
键。