微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python列表理解与cls

如何解决python列表理解与cls

我遇到了如下代码片段:

array = ['a','b','c']
ids = [array.index(cls.lower()) for cls in array]

我有两点困惑:

  1. [... for cls in array] 是什么意思,既然 clsclass 的保留关键字,为什么不直接使用 [... for s in array]
  2. 为什么要写这样复杂的东西而不是只写[i for i in range(len(array))]

我相信这段代码是由比我更有 python 经验的人编写的,我相信他这样做一定有某种原因......

解决方法

cls 不是 class 的保留字。这对于语言设计者来说是一个非常糟糕的名称选择。许多程序员可能会按照惯例使用它,但它并不比参数名称 self 更保留。

如果您在列表中使用不同的大写和小写字符,您会看到区别:

array = ['a','b','c','B','A','c']
ids = [array.index(cls.lower()) for cls in array]
print(ids)

[0,1,2,2]

位置 3 处的值是 1 而不是 3,因为第一次出现的小写 'B' 位于索引 1。类似地,最后位置的值是 2 而不是 5,因为第一个 'c' 位于索引处2.

此列表推导式要求数组始终包含每个大写字母的小写实例。例如 ['a','c'] 会使它崩溃。希望该计划的其余部分有其他保护措施,以确保始终满足此要求。

一种更安全、更有效的编写方法是在遍历数组以获取索引之前构建一个字符位置字典。这将使时间复杂度为 O(n) 而不是 O(n^2)。它还有助于使流程更加稳健。

array     = ['a','Z']
firstchar = {c:-i for i,c in enumerate(array[::-1],1-len(array))}
ids       = [firstchar.get(c.lower()) for c in array]

print(ids)
[0,None]

firstchar 字典包含 array 中包含给定字母的第一个索引。它是通过向后遍历数组来构建的,以便在多次出现同一字母时保留最小的索引。

{'Z': 6,'c': 2,'A': 4,'B': 3,'b': 1,'a': 0}

然后遍历数组形成ids,每个字符使用字典在O(1)时间内找到对应的索引。

使用 .get() 方法允许列表推导式在列表中没有相应的小写值的情况下保留大写字母。在此示例中,它返回 None,但也可以返回字母的索引或第一个大写实例的索引。

,

有些开发人员可能很有经验,但实际上他们编写的代码很糟糕,只是“滑过”。

话虽如此,如果列表包含任何元素中的两个,您对问题 2 的建议输出会有所不同。建议的代码将返回列表元素出现的第一个索引,而您的代码将给出每个单独的项目索引。如果 array 元素不是小写,它也会有所不同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?