在python中更改字典并制作一个新字典

时间:2019-01-09 16:41:09

标签: python

我在python中有一个字典,例如以下示例:

小例子:

d = {'chr12:112843810-112843817': 'CGTAGAG', 'chr16:48394513-48394520': 'TTTAAAC'}

此词典的值是一个字符序列,这些字符只能是A, C, G or T。但是我想制作一个新的字典,其中的键是相似的,但值是不同的。实际上,在新词典中,字符序列会有2个变化:

1-必须反转(方向)。例如“ AGT”将是“ TGA”。 2-我要转换:A-> T,T-> A,C-> G,G-> C。

考虑到以上两项,AGTCC将转换为GGACT

这是小示例的预期输出:

预期输出:

d2 = {'chr12:112843810-112843817': 'CTCTACG', 'chr16:48394513-48394520': 'GTTTAAA'}

我正在尝试使用以下代码在python中做到这一点:

def reverse_complement(dict):
    for v in dict:
        complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
        return [complement[base] for base in v[::-1]]

,但不返回想要获得的结果。你知道如何解决吗?

3 个答案:

答案 0 :(得分:4)

  • fetch("data:application/pdf;base64," + vm.documentData.base64Document).then(function(response) { response.blob().then(function(blob) { document.querySelector("iframe").src = URL.createObjectURL(blob) + "#view=fit"; }); }); 迭代键,而不是值。您应该使用for v in dict遍历键值对。

  • items语句使函数在第一次迭代后进入return

  • return是一个错误的变量名(dict可能更糟,但至少它不会掩盖内置名称)

您可以使用字典功能:

d

或使用str.translate

def reverse_complement(d):
    complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
    return {k: ''.join(complement[base] for base in v[::-1]) for k, v in d.items()}

答案 1 :(得分:0)

类似于@DeepSpace的第一个答案,您可以使用reversed()就地映射补语:

d2 = {k: ''.join(map(complements.get, reversed(v))) for k, v in d.items()}

print(d2)
# {'chr12:112843810-112843817': 'CTCTACG', 'chr16:48394513-48394520': 'GTTTAAA'}

您还可以重建新词典:

''.join(map(complements.get, reversed(v)))

注意: ''.join(complemements.get(x) for x in reversed(v))只是编写#ifndef SINGLETON_H #define SINGLETON_H template <typename C, typename ...Args> class singleton { private: singleton() = default; static C* m_instance; public: ~singleton() { delete m_instance; m_instance = nullptr; } static C& instance(Args...args) { if (m_instance == nullptr) m_instance = new C(args...); return *m_instance; } }; template <typename C, typename ...Args> C* singleton<C, Args...>::m_instance = nullptr; #endif // SINGLETON_H 的另一种方式。

答案 2 :(得分:0)

这里是另一种使用字符串替换方法的解决方案。这可能会更快。 补码方法首先将字符串设置为小写,然后根据小写到大写进行重命名。

“ [::-1]”颠倒顺序,其余为字典理解,可创建新字典

complement = lambda s: s.lower().replace("g","C").replace("c","G").replace("t","A").replace("a","T")
d2 = { k:complement(v)[::-1] for k,v in d.items() }