将python词典转换为python词典

2024-10-01 07:43:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

小例子:

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

我只需要每个项目的值部分,它是一个字母序列,字母是A, T, C or G,而且每个序列的长度是7,所以每个字母序列都有7 positions。我想得到每个位置中提到的4个字母的频率(我们有7个位置)。对于每一个职位,我都会编一本字典,其中字母是关键,每个字母的频率是有价值的。最后我想为所有七个位置制作一本字典,第一本字典就是最后一本字典的值。 下面是小示例的预期输出:

预期产量:

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)

Tags: 示例字典字母counter序列onedictthree
3条回答

下面是一种方法,使用Counter

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}) ....

试试这个:

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
dict = {'chr2:173370685-173370692': 'TACCAAG', 'chr5:118309829-118309836': 'TCTCCTT', 'chr12:104659651-104659658': 'GACCAAA'}
options=['T','A','C','G']
innerdicts=['one','two','three','four','five','six','seven']
def getposcount(idx,letter,dict):
    count=0
    for v in dict.values():
        if v[idx]==letter:
            count+=1
    return count

d = {x:{y:getposcount(innerdicts.index(x),y,dict) for y in options} for x in innerdicts}
print(d)

输出

{'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}}

相关问题 更多 >