[英]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))])
此外,我不理解.extend
与row
的使用,它是迭代器而不是列表。
以下是答案的相关部分。
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 * 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对1.7μs在Python 3.6上运行我的Mac)。
for row in myList:
您创建了一个名为row
的变量,该变量引用myList
的项。
row
是一个整数。
你可以获得列表的列表。 不是整数。
你搞砸了你的清单。 通过打印myList并查看结构的外观进行故障排除,以便了解您正在迭代的内容,因为它可能不是二维列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.