对于医疗应用,我想将多个列表合并为一个列表。每个列表中的项目代表针对特定疾病要采取的行动。
例如列表 Malaria
看起来像这样:
- '给予疟疾药物'
- '给予抗生素'
- '告诉病人明天再来'
- '给你一杯热柠檬茶'
细菌性喉咙痛
的第二个列表是这样的:
- '给予抗生素'
- '给予扑热息痛'
- '给你一杯热柠檬茶'
- '温暖病人'
每个列表中的操作是分层的。这意味着首先提到更重要的任务。
列表本身也有层次结构,因此 Malaria
高于 Bacterial sour throat
。
我需要将这些列表组合成一个全局列表,其中的项目按照保留两个层次结构的方式进行排序。如果患者同时患有疟疾
和细菌性喉咙痛
,并且根据每个行为的重要性接受治疗,情况就是如此。
对于这种情况,我想要这个列表:
- '给予疟疾药物'(来自疟疾列表,因为它高于喉咙痛)
- “给予抗生素”(涵盖两个列表中的一项操作)
- “告诉病人明天再来”(来自疟疾 list )
- “服用扑热息痛”(在
喉咙痛
时比温茶更重要) - 'Give a warm lemon tea'(涵盖两个列表中的一个 Action )
- '温暖病人'
目前这种分类是手工完成的,但是对于 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/