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

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

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

class data
    parent
    id

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

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

回答
編輯回答
單眼皮

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

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
編輯回答
墨沫

貼一下全一點(diǎn)的例子

2017年4月28日 02:01
編輯回答
離夢(mèng)

這個(gè)問(wèn)題可以轉(zhuǎn)換成N叉樹(shù)的遍歷,將某個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn)計(jì)算出來(lái)。

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