排序,使对中的第一个元素出现在匹配对中的第二个元素之前

问题描述 投票:0回答:1

我想对值对列表进行排序,稍后我将使用这些值进行文本替换。代码不应对同一元素进行一次替换,然后进行第二次替换。所以我想对替换列表对进行排序,以防止多个替换。

程序搜索文本。当它找到与替换对中的第一个元素匹配的文本时,它将用第二个元素替换它。

我的替换列表的片段如下所示:

subst_list = [
['AI_010306', 'AI_010307'],
['AI_010307', 'AI_010308'],
['AI_010310', 'AI_010309'],
['AI_010311', 'AI_010310']]

要替换的原始文本片段如下所示:

old_text = "AI_010306 AI_010307 AI_010310 AI_010311"

所需的新文本是:

new_text = "AI_010307 AI_010308 AI_010309 AI_010310"

我希望替换列表如下所示:

subst_list = [
['AI_010307', 'AI_010308'],
['AI_010306', 'AI_010307'],
['AI_010310', 'AI_010309'],
['AI_010311', 'AI_010310']]

如果某个值同时出现在第一个元素集和第二个元素集中,则第一个位置具有该值的对应该在列表中排在前面。

我不想替换“AI_010306”->“AI_010307”,然后替换“AI_010307”->“AI_010308”。

在这种情况下,一个集合中的字符串不存在作为另一集合的子字符串出现的风险。

我尝试按第一个元素排序,也尝试按第二个元素排序,但都不满足条件。所以,与此同时,我一直在手工对这些行进行排序。

以下是替换程序:

with open("source.txt") as f:
    lines = f.readlines()
    for line in lines:
        new_line = line.rstrip()
        for s in subst_list:
            new_line = new_line.replace(s[0], s[1])
        print(new_line.rstrip())

我也尝试过使用字典而不是列表,但结果是一样的。

with open("source.txt") as f:
    lines = f.readlines()
    for line in lines:
        new_line = line.rstrip()
        for s in subst_dict:
            new_line = new_line.replace(s, subst_dict[s])
        print(new_line.rstrip())
python sorting
1个回答
0
投票
import re
from typing import Dict


def replace_tokens(input_text: str, substitutions: Dict[str, str]) -> str:
    input_tokens = re.split('(\\s+)', input_text)
    new_tokens = [substitutions.get(token, token) for token in input_tokens]
    return "".join(new_tokens)


substitutions_dict = {
    'AI_010306': 'AI_010307',
    'AI_010307': 'AI_010308',
    'AI_010310': 'AI_010309',
    'AI_010311': 'AI_010310'
}

old_text = "AI_010306 AI_010307 AI_010310 AI_010311"

print(replace_tokens(old_text, substitutions_dict))
© www.soinside.com 2019 - 2024. All rights reserved.