python - 如何使用 networkx 和 python 将分层列表合并为一个,同时尊重每个列表的层次结构?

标签 python sorting networkx hierarchical topological-sort

对于医疗应用,我想将多个列表合并为一个列表。每个列表中的项目代表针对特定疾病要采取的行动。 例如列表 Malaria 看起来像这样:

  1. '给予疟疾药物'
  2. '给予抗生素'
  3. '告诉病人明天再来'
  4. '给你一杯热柠檬茶'

细菌性喉咙痛的第二个列表是这样的:

  1. '给予抗生素'
  2. '给予扑热息痛'
  3. '给你一杯热柠檬茶'
  4. '温暖病人'

每个列表中的操作是分层的。这意味着首先提到更重要的任务。

列表本身也有层次结构,因此 Malaria 高于 Bacterial sour throat

我需要将这些列表组合成一个全局列表,其中的项目按照保留两个层次结构的方式进行排序。如果患者同时患有疟疾细菌性喉咙痛,并且根据每个行为的重要性接受治疗,情况就是如此。

对于这种情况,我想要这个列表:

  1. '给予疟疾药物'(来自疟疾列表,因为它高于喉咙痛)
  2. “给予抗生素”(涵盖两个列表中的一项操作)
  3. “告诉病人明天再来”(来自疟疾 list )
  4. “服用扑热息痛”(在喉咙痛时比温茶更重要)
  5. 'Give a warm lemon tea'(涵盖两个列表中的一个 Action )
  6. '温暖病人'

目前这种分类是手工完成的,但是对于 50 多种疾病来说它变得太复杂了。 我研究过 networkx 试图进行拓扑排序,但我想这不是正确的方法。

当无法排序且操作顺序相反时,它会变得更加复杂。 例如在 Diarrhoea 中有

  • 让病人喝
  • 给予治疗

Severe Diarrhoea 中,它们的顺序相反

  • 给予治疗
  • 让病人喝

在这种情况下,我希望解决方案将全局列表中的项目加倍

  • 给予治疗
  • 让病人喝
  • 给予治疗

有没有办法至少解决其中一个步骤?

最佳答案

我同意@Corralien 的观点,一旦你有了 DAG,拓扑排序仍然是可行的方法。您只需要正确断开处于同一层次结构级别的元素之间的联系。这可以通过 nx.lexicographical_topological_sort 完成。

import networkx as nx

malaria = ['give malaria medication', 'give antibiotics', 'tell patient to come back tomorrow', 'give warm lemon tea']
bacterial_sore_throat = ['give antibiotics', 'give paracetamol', 'give warm lemon tea', 'warm patient']

edges = list(zip(malaria[:-1], malaria[1:])) + list(zip(bacterial_sore_throat[:-1], bacterial_sore_throat[1:]))
graph = nx.from_edgelist(edges, nx.DiGraph)

def sort_function(item):
    if item in malaria:
        return '01'
    elif item in bacterial_sore_throat:
        return '02'
    else:
        raise ValueError

print(list(nx.lexicographical_topological_sort(graph, sort_function)))

# ['give malaria medication', 'give antibiotics', 'tell patient to come back tomorrow', 'give paracetamol', 'give warm lemon tea', 'warm patient']

关于python - 如何使用 networkx 和 python 将分层列表合并为一个,同时尊重每个列表的层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71045595/

相关文章:

android - 从适配器中生成的值而不是对象变量对 RecyclerView 进行排序?

python - 按长度排序字符串列表不起作用

python - 如何增加标签间距以避免 networkx 图中的标签重叠

python - 如何使用networkx绘制流向箭头?

python - 是否可以从 python 代码中删除所有 __future__ 语句,而不会影响其使用 python 3.7.1 的功能?

python - 高效计算数千个坐标对之间的距离

python - 创建一个简单的 Python 联系表单

javascript - Tablesorter 对点击外部链接进行排序

python - 用python networkx计算图的入度中心化

Python 脚本打开 bash 提示终止脚本