在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/人工智能  Python/ python 實現(xiàn)一個求解當前數(shù)據(jù)所有子項的方法

python 實現(xiàn)一個求解當前數(shù)據(jù)所有子項的方法

假設(shè)數(shù)據(jù)結(jié)構(gòu)是這樣的:
有多條數(shù)據(jù),每條數(shù)據(jù)都有屬性parent(指向它的所屬上級id),自身的唯一標識id。

class data
    parent
    id

當我拿出其中一條數(shù)據(jù)的時候,用一個方法計算出所有下級數(shù)據(jù)。就好比中國行政區(qū)數(shù)據(jù)一樣,當我拿到廣東省的時候,下面的市級,縣級都要得到,如果縣級下面還有分級也要一并拿到。

我寫了一些代碼,都太丑陋了,似乎是要用遞歸,求教一下有沒有什么好的思路?

回答
編輯回答
單眼皮

儲存空間夠大的話可以建立一個字典
假如你的數(shù)據(jù)是個list名字叫CN(中國所有省市縣...)

parent_d = {}
for item in CN:
    parent = item['parent']
    if parent in parent_d:
        parent_d[parent].append(item['id'])
    else:
        parent_d[parent] = [item['id']]

之后遍歷一下

def get_all_children(city_id, parent_d):
    if city_id not in parent_d or not city_id:
        return []
    result = []
    temp_parent = [city_id]
    while temp:
        cur_id = temp_parent.pop(-1)
        result += parent_d[cur_id]
        temp_parent = parent_d[cur_id] + temp_parent
    return result
2017年3月11日 18:38
編輯回答
墨沫

貼一下全一點的例子

2017年4月28日 02:01
編輯回答
離夢

這個問題可以轉(zhuǎn)換成N叉樹的遍歷,將某個節(jié)點的所有子節(jié)點計算出來。

    def return_all_children(self):
        """
        返回所有的子項
        :return:
        """
        root = self
        if not root:
            return []
        que = []  # 保存節(jié)點的隊列
        res = []  # 保存結(jié)果的列表
        que.append(root)  #
        while len(que):  # 判斷隊列不為空
            length = len(que)
            sub = []  # 保存每層的節(jié)點的值
            for i in range(length):
                current = que.pop(0)  # 出隊列的當前節(jié)點
                print(current)
                sub.append(current)
                for child in current.return_children:  # 所有子結(jié)點入隊列
                    que.append(child)
            res.append(sub)  # 把每層的節(jié)點的值加入結(jié)果列表
        return res
2017年8月16日 22:42