我指的是这个具体的答案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))])
此外,我不理解使用.extend
和row
这是迭代器而不是列表。
以下是答案的相关部分。
maxLen = max(map(len, myList))
for row in myList:
if len(row) < maxLen:
row.extend(...)
非常感谢您的简短演练。
或许有更好的方法可以将所有嵌套列表的长度调整为相同的长度。
答案 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 * 3
与list + 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进行故障排除,看看结构是什么样的,这样你就可以知道你在迭代的内容,因为它可能不是一个二维列表。