首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从扁平的json中提取最深的数据?

如何从扁平的json中提取最深的数据?
EN

Stack Overflow用户
提问于 2020-12-21 03:12:46
回答 2查看 41关注 0票数 1

我有一个扁平的json数据,也就是输入数据

代码语言:javascript
复制
data = ['a', 'a-aa', 'a-aa-aaa', 'a-aa-aab', 'a-aa-aab-aaba', 'b', 'b-ba', 'b-ba-baa']

我只需要以下最深的数据,也就是输出数据

代码语言:javascript
复制
a-aa-aaa
a-aa-aab-aaba
b-ba-baa

解释:在此示例中,数据树如下所示:

代码语言:javascript
复制
| a
  | a-aa
    | a-aa-aaa
    | a-aa-aab
      | a-aa-aab-aab
| b
  | b-ba
    | b-ba-baa

我想要最深的一遍,所以这个过程大多是这样的:

代码语言:javascript
复制
| a
 | a-aa
   | a-aa-aaa(traverse over)
   | a-aa-aab
     | a-aa-aab-aab(traverse over)
| b
 | b-ba
   | b-ba-baa(traverse over)

所以,最后,我们可以得到输出数据。我知道这个过程对你来说可能有点简单,但是我把我的想法复杂化了。所以,如果你知道答案,请告诉我。愿上帝保佑你!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-21 04:25:38

您可以使用collections.defaultdict递归地构建树,然后选择树叶:

代码语言:javascript
复制
import collections
data = ['a', 'a-aa', 'a-aa-aaa', 'a-aa-aab', 'a-aa-aab-aaba', 'b', 'b-ba', 'b-ba-baa']
def get_groups(d):
  _d = collections.defaultdict(list)
  for a, [j, *k] in d:
     _d[j].append((a, k))
  for a, b in _d.items():
     k, vals = [x for x, y in b if not y], [(x, y) for x, y in b if y]
     if k and not vals:
        yield from k
     else:
        yield from get_groups(vals)
     
print(list(get_groups([(i, i.split('-')) for i in data])))

输出:

代码语言:javascript
复制
['a-aa-aaa', 'a-aa-aab-aaba', 'b-ba-baa']
票数 1
EN

Stack Overflow用户

发布于 2020-12-21 04:10:15

你可以用列表理解来做这件事,它可能会更快。但是,有一种方法可以在O(n)时间内做到这一点,所以请尝试:

代码语言:javascript
复制
def get_deepest_data(data):
    _max = data[0].count("-")
    deepest_data = list([data[0]])

    for i in data[1:]:
        count = data[i].count("-")

        if count > _max:
            _max = count
            deepest_data = list([data[i]])
        elif count == _max:
            deepest_data.append(data[i])

    return deepest_data
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65387134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档