将python字典转换为python中的字典字典

将python字典转换为python中的字典字典,python,dictionary,count,Python,Dictionary,Count,我有一个类似于以下示例的python字典: 小例子: dict = {'chr2:173370685-173370692': 'TACCAAG', 'chr5:118309829-118309836': 'TCTCCTT', 'chr12:104659651-104659658': 'GACCAAA'} 我只需要每个项目的值部分,它是一个字母序列,字母是a、T、C或G,而且每个序列的长度是7,所以每个字母序列都有7个位置。我想得到每个位置中提到的4个字母的频率(我们有7个positions)。

我有一个类似于以下示例的python字典:

小例子:

dict = {'chr2:173370685-173370692': 'TACCAAG', 'chr5:118309829-118309836': 'TCTCCTT', 'chr12:104659651-104659658': 'GACCAAA'}
我只需要每个项目的值部分,它是一个字母序列,字母是
a、T、C或G
,而且每个序列的长度是7,所以每个字母序列都有
7个位置。我想得到每个位置中提到的4个字母的频率(我们有
7个
positions)。对于每个职位,我都会制作一本字典,其中字母是关键,每个字母的频率是有价值的。最后,我想为所有七个位置制作一本字典,第一本字典就是最后一本字典的值。
以下是小示例的预期输出:

dict = {'chr2:173370685-173370692': 'TACCAAG', 'chr5:118309829-118309836': 'TCTCCTT', 'chr12:104659651-104659658': 'GACCAAA'}
预期产出:

final = {one: {'T': 2, 'A': 1, 'C': 0, 'G': 0}, two: {'T': 0, 'A': 2, 'C': 1, 'G': 0}, three: {'T': 1, 'A': 0, 'C': 2, 'G': 0}, four: {'T': 0, 'A': 0, 'C': 3, 'G': 0}, five: {'T': 0, 'A': 2, 'C': 1, 'G': 0}, six: {'T': 1, 'A': 2, 'C': 0, 'G': 0}, seven: {'T': 1, 'A': 1, 'C': 0, 'G': 1}}
为了得到这个输出,我在
python
中编写了一个代码,但它没有返回我想要的内容。您知道如何修复以下代码吗

one=[]
two=[]
three=[]
four=[]
five=[]
six=[]
seven=[]
mylist = dict.values()
for threeq in mylist:
    one.append(threeq[0])
    two.append(threeq[1])
    three.append(threeq[2])
    four.append(threeq[3])
    five.append(threeq[4])
    six.append(threeq[5])
    seven.append(threeq[6])


from collections import Counter

one=Counter(one)    
two=Counter(two)
three=Counter(three)
four=Counter(four)
five=Counter(five)
six=Counter(six)
seven=Counter(seven)

下面是使用
计数器执行此操作的方法:

from collections import Counter

data = {'chr2:173370685-173370692': 'TACCAAG', 'chr5:118309829-118309836': 'TCTCCTT', 'chr12:104659651-104659658': 'GACCAAA'}

out = {i:Counter(col) for i, col in enumerate(zip(*(data.values()))) }

# we can add the missing keys whose count is 0:
for count in out.values():
    count.update(dict.fromkeys('ATGC', 0))

print(out)

# {0: Counter({'T': 2, 'G': 1, 'A': 0, 'C': 0}), 1: Counter({'A': 2, 'C': 1, 'T': 0, 'G': 0}), 
#  2: Counter({'C': 2, 'T': 1, 'A': 0, 'G': 0}), 3: Counter({'C': 3, 'A': 0, 'T': 0, 'G': 0}), 
#  4: Counter({'A': 2, 'C': 1, 'T': 0, 'G': 0}), 5: Counter({'A': 2, 'T': 1, 'G': 0, 'C': 0}), 
 # 6: Counter({'G': 1, 'T': 1, 'A': 1, 'C': 0})}
我将原始索引保留为整数,使用它们可能比使用诸如“1”、“2”之类的字符串更容易。。。但如果你真的想:

numbers_as_strings = ['one', 'two', 'three', 'four', 'five', 'six', 'seven']
out = {numbers_as_strings[key]:value for key, value in out.items()}
print(out)
# {'one': Counter({'T': 2, 'G': 1, 'A': 0, 'C': 0}), 
#  'two': Counter({'A': 2, 'C': 1, 'T': 0, 'G': 0}) ....

如果愿意接受整数作为键,可以执行以下操作:

from collections import Counter


def counts_with_zero(count, keys='TACG'):
    return {key: count.get(key, 0) for key in keys}


d = {'chr2:173370685-173370692': 'TACCAAG', 'chr5:118309829-118309836': 'TCTCCTT',
     'chr12:104659651-104659658': 'GACCAAA'}

values = list(d.values())
result = {i: counts_with_zero(Counter(column)) for i, column in enumerate(zip(*values), 1)}

print(result)
输出

{1: {'A': 0, 'C': 0, 'G': 1, 'T': 2},
 2: {'A': 2, 'C': 1, 'G': 0, 'T': 0},
 3: {'A': 0, 'C': 2, 'G': 0, 'T': 1},
 4: {'A': 0, 'C': 3, 'G': 0, 'T': 0},
 5: {'A': 2, 'C': 1, 'G': 0, 'T': 0},
 6: {'A': 2, 'C': 0, 'G': 0, 'T': 1},
 7: {'A': 1, 'C': 0, 'G': 1, 'T': 1}}
试试这个:

values = list(dict.values())
r = {}
for i in range(7):
    r[i+1] = {'T': 0, 'A': 0, 'C': 0, 'G': 0}
    for v in values:
        r[i+1][v[i]] += 1
输出

{'six': {'T': 1, 'A': 2, 'G': 0, 'C': 0}, 'one': {'T': 2, 'A': 0, 'G': 1, 'C': 0}, 'two': {'T': 0, 'A': 2, 'G': 0, 'C': 1}, 'five': {'T': 0, 'A': 2, 'G': 0, 'C': 1}, 'three': {'T': 1, 'A': 0, 'G': 0, 'C': 2}, 'seven': {'T': 1, 'A': 1, 'G': 1, 'C': 0}, 'four': {'T': 0, 'A': 0, 'G': 0, 'C': 3}}

预期输出不清楚,你能澄清一下吗?@RomanPerekhrest预期输出是一本包含7项的词典。键是1到7,因为有7个位置(每个字母序列的长度是7),值是另一个字典,其中键是字母(字母是A、T、G或C),值是每个字母的频率。现在清楚了吗?