首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遍历文本文件,并将最低值存储在字典中。

遍历文本文件,并将最低值存储在字典中。
EN

Stack Overflow用户
提问于 2022-03-07 16:17:41
回答 2查看 59关注 0票数 0

我有一个非常大的文本文件(Summary_post_docking.txt),我想过滤它以找到最低的分数。这就是我想出来的:

代码语言:javascript
复制
class Ranker:
def __init__(self):
    self.results = {}
    with open('HTS_post_docking/Summary_post_docking.txt', 'r') as summary:
        for line in summary:
            score = float(line.split()[2])
            frag_name = str(line.split()[0].split('/')[9]).split('_')[0]
            if 0 >= score >= -200:
                self.results[frag_name] = score
                old = self.results[frag_name]
            if frag_name in self.results.keys():
                new = float(line.split()[2])
                if new < old:
                    self.results[frag_name] = new

    print(self.results)

不幸的是,所有这些操作都是取它读取的最后一个值,而不是用新的更低的值覆盖。

[str(line.split().split('/')9).split('_')]是分子的名称,而浮子(line.split()2)是与它相关的分数。

我想要脚本存储分子的名字作为键和分数作为一个值。对于每一行,每次它用相同的键找到一个较低的分数时,我希望它将值升级到它找到的最小值。

编辑:

我在txt文件中包含了几行代码:

代码语言:javascript
复制
/scratch/ludovico3/spike/stalk/vs_docking_smiles/HTS_postdock/1_600/HTS_post_docking/Z385446130_pose1       SCORE_sum: -70.13763978228677   avg_score: -0.7 SD_score: 0.44  avg_GBSA: -5.92 SD_GBSA: 2.96   avg_RMSD: 9.75  SD_RMSD: 3.49
/scratch/ludovico3/spike/stalk/vs_docking_smiles/HTS_postdock/1_600/HTS_post_docking/Z385446130_pose2       SCORE_sum: -18.39638945104759   avg_score: -0.18    SD_score: 0.26  avg_GBSA: -5.2  SD_GBSA: 4.57   avg_RMSD: 34.57 SD_RMSD: 9.29
/scratch/ludovico3/spike/stalk/vs_docking_smiles/HTS_postdock/1_600/HTS_post_docking/Z385446130_pose3       SCORE_sum: -206.23402454507794  avg_score: -2.06    SD_score: 1.15  avg_GBSA: -6.8  SD_GBSA: 1.66   avg_RMSD: 4.05  SD_RMSD: 1.73
/scratch/ludovico3/spike/stalk/vs_docking_smiles/HTS_postdock/1_600/HTS_post_docking/Z385446130_pose4       SCORE_sum: -27.56483931516906   avg_score: -0.28    SD_score: 0.64  avg_GBSA: -2.2  SD_GBSA: 3.13   avg_RMSD: 15.43 SD_RMSD: 6.74

我已经按照建议更新了代码!脚本需要将与键关联的值更新到它找到的最低分数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-07 18:15:09

解决了!

代码语言:javascript
复制
class Ranker:
def __init__(self):
    self.results = {}
    with open('HTS_post_docking/Summary_post_docking.txt', 'r') as summary:
        for line in summary:
            self.set_score(line)

    self.sorted = dict(sorted(self.results.items(), key=lambda item: item[1]))
    print(self.sorted)

def set_score(self, line):
    new_score = float(line.split()[2])
    frag_name = str(line.split()[0].split('/')[9]).split('_')[0]

    if not (0 >= new_score >= -250):
        return

    if frag_name in self.results.keys():
        old_score = self.results[frag_name]
        if new_score > old_score:
            return

    self.results[frag_name] = new_score
票数 0
EN

Stack Overflow用户

发布于 2022-03-07 16:26:44

你以前的价值可能等于零,而且.根据分子来管理旧值是否合乎逻辑?你不会那么做的。

代码语言:javascript
复制
class Ranker:
    def __init__(self):
        self.results = {}
        with open('HTS_post_docking/Summary_post_docking.txt', 'r') as summary:
            for line in summary:
                molecule_score = float(line.split()[2])
                molecule_name = str(line.split()[0].split('/')[9]).split('_')[0]
                if molecule_name not in self.results:
                    self.results[molecule_name] = score
                elif self.results[molecule_name] > score:
                    self.results[molecule_name] = score
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71384072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档