繁体   English   中英

将所有嵌套列表调整为相同的长度

[英]Adjust all nested lists to the 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(...)

我们将非常感谢您的简短演练。

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

好的,让我们逐行完成。 我个人认为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 + 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] 第3项与max_len (3)的长度相同,因此if条件为false。 结果将是:

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

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

for row in myList:

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

row是一个整数。

你可以获得列表的列表。 不是整数。

你搞砸了你的清单。 通过打印myList并查看结构的外观进行故障排除,以便了解您正在迭代的内容,因为它可能不是二维列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM