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

时间:2018-02-06 07:54:23

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

我指的是这个具体的答案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(...)

非常感谢您的简短演练。

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

2 个答案:

答案 0 :(得分: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]。第3项与max_len(3)的长度相同,因此if条件为false。结果将是:

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

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

答案 1 :(得分:0)

for row in myList:

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

row是一个整数。

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

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