【问题标题】:Consolidate list items, based on a reference tree using Python使用 Python 基于参考树合并列表项
【发布时间】:2021-04-29 19:41:54
【问题描述】:

我有一个分层数据的“参考树”。一个有代表性的例子:

1
├── 1.1
│   ├── 1.1.1
│   └── 1.1.2
├── 1.2
└── 1.3
2
├── 2.1
│   └── 2.1.1
├── 2.2
├── 2.3
└── 2.4
3
├── 3.1
└── 3.2

然后我有一个项目列表,它们出现在我的参考树中。

如果存在子树中的所有子节点,则可以将它们合并到节点中。 因此,我想简化列表。

例如给定输入[3.1, 3.2, 1.1, 1.2, 1.3, 2.1, 2.2],我想返回[3, 1, 2.1, 2.2](尽管输出的顺序并不重要)。

我的数据集比较小,所以性能不是问题。但我很想学习如何以精美的 Pythonic 方式做到这一点!

我不确定哪些技术、算法或数据结构可能最合适,也不确定如何命名我的问题。所以我很想了解更多(“你所描述的是...”)

【问题讨论】:

  • “已结束。这个问题需要详细说明。”
  • 投票结束问题的人很可能认为您的帖子可能过于离题或过于宽泛。如果您要提供到目前为止已经编写的代码示例和/或您已经尝试过的方法的描述,那肯定会有所帮助。

标签: python list tree


【解决方案1】:

您可以递归地遍历结构,选择每个级别的所有子项都存在于您的输入中的级别和值:

from collections import defaultdict
data = {'1': {'1.1': {'1.1.1': None, '1.1.2': None}, '1.2': None, '1.3': None}, '2': {'2.1': {'2.1.1': None}, '2.2': None, '2.3': None, '2.4': None}, '3': {'3.1': None, '3.2': None}}
vals = ['3.1', '3.2', '1.1', '1.2', '1.3', '2.1', '2.2'] 
def get_paths(d, c = None):
   if all(i in vals for i in d):
      yield (c, list(d))
   else:
      for a, b in d.items():
         if b is not None:
            yield from get_paths(b, a)

r = list(get_paths(data))
result = [a for a, _ in r]+[i for i in vals if all(i not in j for _, j in r)]

输出:

['1', '3', '2.1', '2.2']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多