我有一个扁平的json数据,也就是输入数据。
data = ['a', 'a-aa', 'a-aa-aaa', 'a-aa-aab', 'a-aa-aab-aaba', 'b', 'b-ba', 'b-ba-baa']我只需要以下最深的数据,也就是输出数据
a-aa-aaa
a-aa-aab-aaba
b-ba-baa解释:在此示例中,数据树如下所示:
| a
| a-aa
| a-aa-aaa
| a-aa-aab
| a-aa-aab-aab
| b
| b-ba
| b-ba-baa我想要最深的一遍,所以这个过程大多是这样的:
| 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)所以,最后,我们可以得到输出数据。我知道这个过程对你来说可能有点简单,但是我把我的想法复杂化了。所以,如果你知道答案,请告诉我。愿上帝保佑你!
发布于 2020-12-21 04:25:38
您可以使用collections.defaultdict递归地构建树,然后选择树叶:
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])))输出:
['a-aa-aaa', 'a-aa-aab-aaba', 'b-ba-baa']发布于 2020-12-21 04:10:15
你可以用列表理解来做这件事,它可能会更快。但是,有一种方法可以在O(n)时间内做到这一点,所以请尝试:
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_datahttps://stackoverflow.com/questions/65387134
复制相似问题