McM*_*cMo 5 python for-loop list python-3.x
我指的是这个具体的答案使嵌套列表的长度相同.由于我还没有权限发表评论,并且回答该主题的问题会违反规则,我问了一个新问题.
我不完全理解答案.在我的理解row
中,for循环中的迭代器通常是一个整数值,它遍历每个元素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>
Run Code Online (Sandbox Code Playgroud)
指的是这条线
row.extend(['null'*(len(maxSS7) - len(row))])
Run Code Online (Sandbox Code Playgroud)
另外我不明白,使用.extend
与row
它是迭代器,而不是一个列表.
以下是答案的相关部分.
maxLen = max(map(len, myList))
for row in myList:
if len(row) < maxLen:
row.extend(...)
Run Code Online (Sandbox Code Playgroud)
我们将非常感谢您的简短演练.
或者可能有更好的方法将所有嵌套列表的长度调整为相同的长度.
好的,让我们逐行浏览一下。就我个人而言,我不认为map
Python 中很惯用,所以我会这样写:
maxLen = max(map(len, myList))\n
Run Code Online (Sandbox Code Playgroud)\n\n作为生成器表达式:
\n\nmax_len = max(len(item) for item in my_list)\n
Run Code Online (Sandbox Code Playgroud)\n\n第二个版本几乎是简单的英语:让max_len
是 中每一项的长度中的最大值my_list
。
理解 Python 中的东西的最好方法就是启动 REPL 并尝试它。因此,如果您有my_list
一个列表列表:
my_list = [[1], [1, 2], [1, 2, 3]]\n
Run Code Online (Sandbox Code Playgroud)\n\n上面的内容将为您提供最大项目的长度:3
\n\n现在您想让每个项目都具有相同的尺寸。你怎么能这么做呢?一种方法是将None
项目附加到其中。对于列表中的每个项目,您测试该项目的长度是否小于列表中最大的项目,并且它几乎是简单的英语:
for item in list: # for each item in the list\n while len(item) < max_len: # while the item length is smaller than 3\n item.append(None) # append None to the item\n
Run Code Online (Sandbox Code Playgroud)\n\n您可能想做一些过早的优化并调用extend
一次而不是调用append
多次,因为您认为这种方式性能会更好(但除非您已经分析了两种解决方案,否则您无法真正告诉它):
for item in list:\n if len(item) < max_len:\n item.extend([None] * (max_len - len(item)))\n
Run Code Online (Sandbox Code Playgroud)\n\n现在这是怎么回事?在Python中,list + list
连接两个列表副本,与list * 3
相同list + list + list
。因此,在 for 循环的第一次迭代中,item
is [1]
、len(item)
is 1 和max_len - len(item)
is 3 - 1
。最后,在调用第一项之后[None] * 2
就是这样。第二个项目也是如此,它的长度是 2,3 减 2 是 1,最终结果是。第 3 项的长度与 (3) 相同,因此 if 条件为 false。结果将是:[None, None]
extend
[1, None, None]
[1, 2, None]
max_len
[[1, None, None], [1, 2, None], [1, 2, 3]]\n
Run Code Online (Sandbox Code Playgroud)\n\n列表列表中的所有列表现在都具有相同的大小,3。为了完整起见,对于这么小的列表,该extend
版本比原来的版本快不到 1 微秒,append
所以几乎不值得麻烦(1.64 \xc2\xb5s 与 1.7 \xc2\xb5s(在我的 Mac 上运行的 Python 3.6)。