【问题标题】:C equivalent for nested lists (Python)嵌套列表的 C 等效项 (Python)
【发布时间】:2017-12-04 07:00:43
【问题描述】:

我是 C 的新手,并试图通过与 Python 的比较来学习。

我的问题是微不足道的,但我仍然需要专家的一些解释。这是一个 Python 嵌套列表结构:

L = [1, [2, [3, 4], 5], 6, [7, 8]]

这里有一段有趣的代码(取自 Lutz 的“Learning Python”),用于处理嵌套结构(求和元素):

def sumtree(L):
    tot = 0
    for x in L:
        if not isinstance(x, list):
            tot += x
        else:
            tot += sumtree(x)
    return tot

如果我将 L 传递给这个函数,我将得到 36,这是 L 中元素的总和。 嵌套列表和这个特定函数如何准确地翻译成 C 语言?

【问题讨论】:

  • C 中的数组是固定长度的。如果你想要可变长度,你将需要一个涉及指针的结构。尝试阅读结构和链表。
  • 您的问题完全合法。然而,答案是 C 不支持将“列表”作为内置结构。您必须自己发明一个“列表”,使用“结构”或“数组”等结构。
  • Python 是一种动态类型语言,与 C 有很大的不同。你不能期望 C 中的代码像 python 中那样。
  • 我不期望相同的代码,我首先想要相同的结果

标签: c arrays algorithm data-structures nested


【解决方案1】:

L 的每个元素是什么类型?它可以是一个数字(例如 C 中的 int),甚至是一个列表(通常在 C 中使用 structs 实现一个列表)。

为了实现这一点,您需要一个通用列表(即每个节点的数据都是void* 类型)。请注意,C 不提供标准库中的列表,您必须编写一个(这里是 example)。

然后,为了得到总和,你会做这样的事情:

int sumtree(struct listnode * L) {
    int tot = 0;
    while (L != NULL) {
        if(L.data /* TODO: check if it is a number*/)
            tot += L.data;
        else /* L.data is a sublist */
            tot = sumtree(L.data);
        list = list->next;
    }
    return tot;
}

为了得到类型,你需要按照这个答案:How do I check if a variable is of a certain type (compare two types) in C?

但是,C 中的这种嵌套列表并不常见,我建议您重新解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-15
    • 2020-09-10
    • 2023-03-29
    • 1970-01-01
    • 2011-06-05
    • 2013-11-26
    • 2017-11-19
    • 1970-01-01
    相关资源
    最近更新 更多