【问题标题】:Splitting a tuple with list of tuples that generates a family tree使用生成家谱的元组列表拆分元组
【发布时间】:2020-03-12 07:37:55
【问题描述】:

让我们使用元组和列表来表示家谱。 每个人都表示为一个元组。元组的第一个元素是这个人的名字。元组的第二个元素是一个包含这个人的孩子的列表。每个孩子都表示为一个元组本身。如果一个人没有孩子,他/她的孩子列表是空的。 例如,如果 Mary 没有孩子,则表示为 ('Mary', [])。 如果 Jane 有两个名为 Nick 和 Wendy 的孩子,而 Nick 和 Wendy 都没有孩子,则 Jane 表示为 ('Jane', [('Nick', []), ('Wendy', [])])。 如果 Mary 和 Jane 是 Frank 的孩子,而 Frank 没有其他孩子,则 Frank 表示为 ('Frank', [('Mary', []), ('Jane', [('Nick', [ ]), ('温迪', [])])])。 下图显示了他们的关系:

定义一个名为get_family_members() 的函数,该函数接受一个名为 head 的人的表示,该人表示一个家谱的头部。头部可能有几个孩子、孙子、曾孙等。该函数以列表的形式返回此人家庭的所有成员(包括他/她自己)。成员应按代排序。换句话说,第 n 代的人应该总是出现在第 (n-1) 代的人之后。此外,同一代人应根据他们在原始列表中的顺序进行排序。例如,如果 Nick 和 Wendy 属于同一代,并且 Nick 在原始列表中出现在 Wendy 之前,那么 Nick 在返回列表中应该出现在 Wendy 之前。

这是我所做的:

def get_family_members(head):
    # modify the code below
    new_dict = {}
    return_list = []
    new_list = head
    #append first ele in
    return_list.append(new_list[0])
    new_dict[new_list[0]] = new_list[1]
    # new_list = new_list[1]
    key = new_list[0]
    print(new_dict[key])
    end = False
    j = 0
    if new_dict[key] != []:
        while end == False:
            i = 0
            for tuple1 in new_dict[key]:
                if tuple1[i] not in return_list:
                    return_list.append(tuple1[i])
                    new_dict[tuple1[i]] = tuple1[i+1]
                    print("element",tuple1[i])
                    print("new list",new_dict[tuple1[i]])
                    print("return list",return_list)
                    if tuple1[i+1] != []:
                        key = tuple1[i]


                else:
                    end = True
                    return return_list
                print("key",key)

    return [key]

但是当我使用这个测试用例时似乎是错误的:

print("Test Case #1:")
print()

family_head = ('Mary', [])
result_list = get_family_members(family_head)
print("Expected: ['Mary']")
print("Actual  : " + str(result_list))
print()
print("Expected type of returned value: <class 'list'>")
print("Actual type of returned value  : " + str(type(result_list)))
print()
print("====================")
print()

# Test Case 2:
print("Test Case #2:")
print()

family_head = ('Jane', [('Nick', []), ('Wendy', [])])
result_list = get_family_members(family_head)
print("Expected: ['Jane', 'Nick', 'Wendy']")
print("Actual  : " + str(result_list))
print()
print("====================")
print()

# Test Case 3:
print("Test Case #3:")
print()

family_head = ('Frank', [('Mary', []), ('Jane', [('Nick', [])])])
result_list = get_family_members(family_head)
print("Expected: ['Frank', 'Mary', 'Jane', 'Nick']")
print("Actual  : " + str(result_list))
print()
print("====================")
print()

# Test Case 4:
print("Test Case #4:")
print()

family_head = ('Alan', [('Bob', [('Chris', [])]), ('Eric', [])])
result_list = get_family_members(family_head)
print("Expected: ['Alan', 'Bob', 'Eric', 'Chris']")
print("Actual  : " + str(result_list))
print()
print("====================")
print()

# Test Case 5:
print("Test Case #5:")
print()

family_head = ('Alan', [('Bob', [('Chris', []), ('Debbie', [('Cindy', [])])]), ('Eric', [('Dan', []), ('Fanny', [('George', [])])]), ('Hannah', [])])
result_list = get_family_members(family_head)
print("Expected: ['Alan', 'Bob', 'Eric', 'Hannah', 'Chris', 'Debbie', 'Dan', 'Fanny', 'Cindy', 'George']")
print("Actual  : " + str(result_list))
print()
print("====================")
print()

【问题讨论】:

    标签: python list tuples family-tree


    【解决方案1】:

    考虑以下树

                        Root
        1           2           3           4
    11  12  13   21   22                41      42
    

    可以写成

                        (Root,[
        (1,[(11,[]),12,13]),  (2,[21,22]), (3,[]), (4,[41,42])
    ])
    

    输出应该是

    [Root, 1 ,2, 3, 4, 11, 12, 13, 21, 22]
    

    (请注意,对于所有叶子(但 11 个)我没有写一个 (12,[]) 元组,而是直接写原始类型 12

    现在这种遍历是调用bfs

    由于我们有一个没有循环的,bfs可以进一步简化。

    • 仍然保留将当前“孩子”的探索延迟到堆栈后面的想法
    • 关于元组“11”的东西,stack += children 没有被修改 if children==[] 所以这仍然可以
    def get_family_members(family):
        (root, children) = family
        L = [root]
        stack = children
    
        while len(stack):
            node = stack.pop(0)
            #if we pushed a leaf
            if type(node) is not tuple:
                L += [node]
            else:
                #add children to the __back__ of the stack
                (child, children) = node
                L += [child]
                stack += children
        return L
    fam = (0,[
        (1,[(11,[]),12,13]),  (2,[21,22]), (3,[]), (4,[])
    ])
    print(get_family_members(fam))
    #[0, 1, 2, 3, 4, 11, 12, 13, 21, 22]
    

    【讨论】:

      猜你喜欢
      • 2014-04-27
      • 2019-11-24
      • 2019-10-20
      • 1970-01-01
      • 2014-04-23
      • 2011-04-26
      • 2013-11-30
      • 2018-03-12
      • 2017-07-30
      相关资源
      最近更新 更多