【问题标题】:Sorting list of strings based on both sides of a delimiter ("|") in Python 3基于 Python 3 中定界符 (\"|\") 两侧的字符串列表排序
【发布时间】:2022-11-19 21:01:09
【问题描述】:

我希望对说明依赖关系的字符串列表进行排序(通过 PC 算法确定的贝叶斯网络的结构)。

例如

verbose_struct = ['A', 'C|A,E', 'E', 'B|C,D', 'D']
sorted_struct = ['A', 'E', 'D', 'C|A,E', 'B|C,D']

字符串的顺序取决于之前是否列出了依赖项(分隔符“|”之后的字母,例如 B 依赖于 C 和 D)。如上所示,'E' 应位于 'C|A,E' 之前,因为 C 依赖于 E。没有依赖性的字符串应位于所有具有依赖性的字符串之前,例如'C|A,E' 和 'B|C,D' 之前的 'D'。

我该怎么做?

我已经设法使用以下命令根据它们是否具有依赖关系来对字符串进行排序:

sorted_struct = sorted(verbose_struct, key=lambda x: len(x.split('|')))

我不确定如何根据变量的依赖关系进一步对变量进行排序,因为我对 Python 中的 lambda 函数相当不熟悉。

【问题讨论】:

  • 将所有带有竖线定界符的项目(无论字符串是什么)移到排序的前面,将带有竖线的项目移到排序的末尾是否足够,或者是否还需要其他东西? ... 哦,我想我在这里回答了我自己的问题。 C 是一个没有单独定义的元素的例子,但是需要在对C 的依赖之前。
  • 不幸的是没有。正如您所注意到的,C 没有单独定义,但必须出现在 D 之前,因为 D 依赖于 C。在我程序的其他方面,使用此结构来确定概率,因此 C 需要在 D 之前,否则找不到 C 的值。
  • 您的经验水平如何?您是否愿意定制class
  • 您将如何对 ['A|B', 'B|C', 'C|A'] 进行排序?
  • @AirSquid 我很乐意上课,是的。在像上面那样转换为字符串数组之前,数据存储在嵌套字典中,这样每个子字典要么为空(没有父项),要么具有父项值 - 例如A: {}, C: {'parents': [A,E]}。如果那会有所帮助。尽管在谷歌搜索后显然字典没有顺序,因此在我将它们转换为字符串格式 ('C|A,E') 之前无法排序

标签: python python-3.x sorting bayesian-networks


【解决方案1】:

理想情况下,您应该创建一个依赖树并从添加叶子和删除叶子开始。 但是对于像你这样的简单例子,你可以做一个简单的队列并开始追加到你所谓的“排序”数组中

import queue

a = list(filter(lambda x: len(x) == 1, verbose_struct ))
b = {x.split('|')[0]: tuple(x.split('|')[1].split(',')) for x in  filter(lambda x: len(x) > 1, verbose_struct )}
nodes = a[:]
q = queue.deque(b.keys())
while q:
    cur = q.pop()
    if all(map(lambda x: x in nodes, b[cur])):
        nodes.append(cur[0])
        a.append(f"{cur}|"  + ",".join(b[cur]))
    else:
        q.appendleft(cur)

a 将是您的排序输出

【讨论】:

  • 数据在转换为上述字符串数组之前存储在嵌套字典中,这样每个子字典要么为空(无父项),要么具有父项值 - 例如A: {}, C: {'parents': [A,E]}。如果那会使排序更容易。虽然我读到字典没有先天顺序,因此无法排序,这就是为什么我将它们转换为字符串(这是最终所需的输出格式)
  • 我会试试这个,谢谢
猜你喜欢
  • 2018-03-31
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 2023-01-27
  • 2021-07-28
  • 2023-03-25
相关资源
最近更新 更多