【问题标题】:Adjust all nested lists to the same length将所有嵌套列表调整为相同的长度
【发布时间】:2018-07-16 05:17:08
【问题描述】:

我指的是这个特定的答案Making nested lists same length。由于我还没有发表评论的权限,并且回答该主题的问题会违反规则,因此我提出了一个新问题。

我不完全理解答案。 在我的理解中,for循环中的迭代器row通常是一个整数值,它遍历myList中的每个元素。那么怎么可能使用len(row) 作为条件的一部分,因为它只是一个整数呢?有什么我想念的吗?

我已尝试将此解决方案应用于我的代码,但正如预期的那样,我收到一条错误消息

TypeError: object of type 'int' has no len()
 args = ("object of type 'int' has no len()",)
 with_traceback = <built-in method with_traceback of TypeError object> 

参考这一行

row.extend(['null'*(len(maxSS7) - len(row))])

此外,我不明白 .extendrow 的使用,这是迭代器而不是列表。

这是答案中的相关部分。

maxLen = max(map(len, myList))
for row in myList:
    if len(row) < maxLen:
        row.extend(...)

非常感谢您提供简短的演练。

或者也许有更好的方法可以将所有嵌套列表的长度调整为相同的长度。

【问题讨论】:

  • 不,row 不是整数。它也不是迭代器。这只是一个列表,其中有一个len
  • 试试for row in myList: print('Row:', row)看看row到底是什么。
  • 好的。基本上fornest 中的每个列表都做一些事情。我明白。这很有帮助。那么为什么它会抛出问题中提到的错误?
  • 您正确识别了协议。很好地发布另一个问题,而不是因为做你不应该做的事情而受到打击。有一个 +1
  • @MadPhysicist:谢谢。我有一些不太好的帖子,因为我还在学习规则。我快到了。

标签: python python-3.x list for-loop


【解决方案1】:
for row in myList:

您创建了一个名为 row 的变量,它引用了 myList 中的一个项目。

row 是一个整数。

你可以得到一个列表的 len。不是整数。

你搞砸了你的清单。通过打印 myList 并查看结构的外观进行故障排除,这样您就知道您正在迭代什么,因为它可能不是二维列表。

【讨论】:

    【解决方案2】:

    好的,让我们逐行浏览。就我个人而言,我不认为map 在 Python 中非常地道,所以我会这样写:

    maxLen = max(map(len, myList))
    

    作为生成器表达式:

    max_len = max(len(item) for item in my_list)
    

    第二个版本几乎是简单的英语:让max_len成为my_list中每个项目长度中的最大值。

    理解 Python 的最佳方式就是启动 REPL 并尝试一下。因此,如果您将my_list 作为列表列表:

    my_list = [[1], [1, 2], [1, 2, 3]]
    

    上面将为您提供最大项目的长度:3

    现在您想让每个项目都具有相同的大小。你怎么能那样做?一种方法是将None 项目附加到它。对于列表中的每个项目,您测试项目的长度是否小于列表中最大的项目并且它几乎是简单的英语:

    for item in list:                # for each item in the list
        while len(item) < max_len:   # while the item length is smaller than 3
            item.append(None)        # append None to the item
    

    您可能想要做一些过早的优化并调用extend 一次而不是多次调用append,因为您认为这样性能会更好(但除非您对两者都进行了分析,否则您无法真正告诉它解决方案):

    for item in list:
        if len(item) < max_len:
            item.extend([None] * (max_len - len(item)))
    

    现在这里发生了什么?在 Python 中,list + list 连接两个列表副本,list * 3list + list + list 相同。所以在 for 循环的第一次迭代中,item[1]len(item) 是 1,max_len - len(item)3 - 1。最后,[None] * 2[None, None],所以在调用extend 之后,第一项将是[1, None, None]。第二项也是一样,它的长度是 2,3 减 2 是 1,它最终会是 [1, 2, None]。第三项的长度与max_len (3) 的长度相同,因此 if 条件为假。结果将是:

    [[1, None, None], [1, 2, None], [1, 2, 3]]
    

    列表列表中的所有列表现在都具有相同的大小,3. 为了完整起见,对于这么小的列表,extend 版本比 append 版本快不到 1 微秒,因此几乎不值得麻烦(在我的 Mac 上运行的 Python 3.6 中为 1.64 µs 与 1.7 µs)。

    【讨论】:

    • 谢谢。这是非常详细的演练。感谢您的努力。
    猜你喜欢
    • 2015-05-07
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 2023-02-26
    相关资源
    最近更新 更多