python - 将字典与其自身进行比较,但如果已经比较,则避免对键进行两次比较

标签 python bioinformatics

拜托,我再次需要帮助。

我有一个名为 vf_to_cluster.txt 的文件,如下所示:

simplified screenshot of my file
我从中创建了一个名为 vf_accession_to_cluster_groups 的字典,其中键是 vf_accession (AI0...),值是集群组列表 (['1',' 2','3'...])。
我已经通过这种方式编码来做到这一点(我知道这不是一个漂亮的代码,但我现在可以用我所知道的抱歉):

f = 'script_folder/vf_to_cluster.txt'
vf_accession_to_cluster_groups = {}

with open(f, 'r') as f6:
    for lines in f6.readlines():
        lines = lines.replace('[', '')
        lines = lines.replace(']', '')
        lines = lines.replace(',', '')
        lines_split = lines.strip().split(' ')
        vf_keys = lines_split[0]
        cluster_values = lines_split[1:]
        vf_accession_to_cluster_groups[vf_keys] = cluster_values

获得这本字典后,我的主要目标是查看有多少 vf_accessions (AI0...) 共享相同的集群组。因此,我可以说,例如 AI001 和 AI002 共享 4 个簇组,这意味着这两个 vf_accession 可能相同或非常接近(由相同基因编码)。
我编写了这段代码:

for vf_1 in vf_accession_to_cluster_groups.keys():
    print '-'*40
    for vf_2 in (vf_accession_to_cluster_groups.keys():
        res = 0 
        if vf_1 != vf_2:
            for i in vf_accession_to_cluster_groups[vf_1]:
                for j in vf_accession_to_cluster_groups[vf_2]:
                    if i == j : 
                        res = res + 1

            print vf_1, vf_2, res

我得到了类似的东西:
output of my code in form of matrix-ish

我设法放弃这样的比较:AI001 AI001 或 AI002 AI002...
通过使用 if vf_1 != vf_2:

但我不能不允许这样的比较: AI014 AI015 之后,我的代码以另一种方式比较它们 AI015 AI014 所以基本上,我想要的是放弃这种类型的比较。如果比较过一次,就不要再以其他方式进行比较。有人可以帮我吗?

此外,如果任何生物信息学家看到我的矩阵,您是否认为我应该将簇列表的大小包含在我的 vf_accession 比较中,例如:

dist = float(res) / len(set(vf_accession_to_cluster_groups[vf_1] + vf_accession_to_cluster_groups[vf_2]))

感谢大家提供的任何帮助。

最佳答案

如果您没有数百万个键,您可以将键存储在列表中并对它们进行排序(使结果易于阅读)。

cluster_groups = list(vf_accession_to_cluster_groups.keys())
cluster_groups.sort()

现在您可以使用 enumerate 循环遍历所有键(最后一个键除外,因为您不需要将它与自身进行比较):

for index, vf_1 in enumerate(cluster_groups[:-1]):

并且对刚刚用于外循环的键之后的所有键进行比较循环

    for vf_2 in cluster_groups[index + 1:]:

完整代码

cluster_groups = list(vf_accession_to_cluster_groups.keys())
cluster_groups.sort()

for index, vf_1 in enumerate(cluster_groups[:-1]):
    print('-'*40)
    for vf_2 in cluster_groups[index + 1:]:
        res = 0 
        for i in vf_accession_to_cluster_groups[vf_1]:
            for j in vf_accession_to_cluster_groups[vf_2]:
                if i == j : 
                    res = res + 1

        print(vf_1, vf_2, res)

一些小建议

  • 将结果存储在字典中,以便您稍后检索。您可以使用字典的字典。
  • 如果您想检查某个项目是否在列表中,只需使用

    如果 my_list 中有项目:

更新代码

cluster_groups = list(vf_accession_to_cluster_groups.keys())
cluster_groups.sort()

results = dict()

for index, vf_1 in enumerate(cluster_groups[:-1]):
    print('-'*40)
    results[vf_1] = dict()
    for vf_2 in cluster_groups[index + 1:]:
        res = 0 
        for i in vf_accession_to_cluster_groups[vf_1]:
            if i in vf_accession_to_cluster_groups[vf_2]:
                res = res + 1

        print(vf_1, vf_2, res)
        results[vf_1].update({vf_2: res})


def get_results(key1, key2, results):
    if key1 > key2:
        key1, key2 = key2, key1

    if results.get(key1):
        return results[key1].get(key2)
    return None

关于python - 将字典与其自身进行比较,但如果已经比较,则避免对键进行两次比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45232360/

相关文章:

python - 如何同时运行两个线程?

python - skimage 在 LAB 色彩空间中为每个 channel 使用什么范围?

python - 使用python查找和替换列表中的一些元素

python - 蛇制造 : rule's input with different pattern

javascript - 将数学公式转换为 node.js

带有 .pdb 文件的 python

python - 定义计算氨基酸相对频率的函数

python - 在 python pandas 中应用带有 shift 函数的 lambda 是要替换一些空元素

python - 从队列中间删除一个项目?

regex - Perl 正则表达式 : howto get open-reading-frames without internal stop-codons?