【发布时间】:2020-11-16 04:31:21
【问题描述】:
快速提问...有点随机。
我想找到一种方法来返回一个列表,其中包含 一行 python 中的单独列表中的所有项目长度...使用 python 3.8 ...我尝试了以下:
需要处理的列表(是的,每个索引都必须包含在它自己的列表中,我知道这既不普通也不实用……):
tmp =[['one'], ['two'], ['three']]
我试过的代码:
lens = [len(item[a][0]) for a, item in enumerate(tmp)]
它返回的错误:
IndexError: list index out of range
...
当然,通常是这样的声明:
lens = [len(item) for item in tmp] 在这里就足够了,如果我们有一个 not 包含子列表的列表,那效果很好……但是,如果我能抓住每个子列表的字符串长度,我会很高兴-索引全部在一行中。
对于我想象中的人会问:不,我没有必须在一行中执行此操作,但我与另一位程序员朋友就最快的方法进行了一次厚颜无耻的小辩论,我想知道是否有可能只用一行。不实用,我知道。
对我来说,在调用时,python 还没有 a 或 item 的价值(解释我的索引超出范围错误),因为我希望通过 enumerate(tmp) 为它们分配价值。 ..
自然地,逐行键入相同的代码是可行的,因为 enumerate 可以在调用 a 和 item 后对其进行分配...
但我不完全明白为什么像lens = [len(item) for item in tmp] 这样的东西会起作用,但这不会。变量分配似乎以相同的顺序发生,不是吗?
我之前经历过,Python 不太擅长处理返回多个值/对象的函数……也许它会是 3.9 的更新?谁知道呢!
干杯! (:
【问题讨论】:
-
lens = [len(item[0]) for item in tmp]? -
当你做
for a, item in enumerate(tmp)时,你期望a的值是第一次?您第一次期望item的值是多少?您希望item[a][0]评估结果是什么? -
对于输入
tmp =[['one'], ['two'], ['three']],你希望输出是什么? -
几乎,但这只会返回第一个索引的长度,并且它也会返回一个值 1,因为该索引指向一个长度为 1 项的列表......这就是为什么我有 item[a][0] ...每个子列表将只包含一个项目,因此 0 索引是一个安全的常量,但主索引需要迭代。
-
@KarlKnechtel 输出应该是:[3, 3, 4](每个子索引中包含的每个字符串的长度)
标签: python python-3.x enumerate one-liner