python - 不懂Python表达式

标签 python list lambda expression

我对 Python 有一些基本知识,但我不知道下面的代码会发生什么。有人可以帮我解释或将其“翻译”成更正常/常见的表达方式吗?

steps = len(t)
sa = [i for i in range(steps)]
sa.sort(key = lambda i: t[i:i + steps])#I know that sa is a list
for i in range(len(sa)):
   sf = t[sa[i] : sa[i] + steps]

't'实际上是一个字符串

谢谢。

最佳答案

What I don't understand is the code: sa.sort(key = lambda i: t[i:i + steps])`

sa.sort(key = lambda i: t[i:i + 步骤])

它根据子字符串t[i:i+len(t)]的自然顺序对sa进行排序。实际上,i + steps 始终大于或等于 steps(即 len(t)),因此可以写成 t [i:] 相反(这使得代码更容易理解)

您将更好地理解使用装饰/排序/取消装饰模式:

>>> t = "azerty"
>>> sa = range(len(t))
>>> print sa
[0, 1, 2, 3, 4, 5]
>>> decorated = [(t[i:], i) for i in sa]
>>> print decorated
[('azerty', 0), ('zerty', 1), ('erty', 2), ('rty', 3), ('ty', 4), ('y', 5)]
>>> decorated.sort()
>>> print decorated
[('azerty', 0), ('erty', 2), ('rty', 3), ('ty', 4), ('y', 5), ('zerty', 1)]
>>> sa = [i for (_dummy, i) in decorated]
>>> print sa
[0, 2, 3, 4, 5, 1]

and sf = t[sa[i] : sa[i] + steps]

这也可以写得更简单:

for i in range(len(sa)):
    sf = t[sa[i] : sa[i] + steps]

=>

for x in sa:
    sf = t[x:]
    print sf

产生:

azerty
erty
rty
ty
y
zerty

您会注意到这正是使用的 key (然后被丢弃) 在上面的装饰/排序/取消装饰示例中,因此整个事情可以重写为:

def foo(t):
    decorated = sorted((t[i:], i) for i in range(len(t)))
    for sf, index in decorated:
        print sf
        # do something with sf here

至于这一切应该做什么,我完全迷失了,但至少你现在有了这个代码的更加Pythonic(可读......)版本;)

关于python - 不懂Python表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43521284/

相关文章:

python - 使用 kivy 更新多个标签

python - 比较字典中列表中的任意数量的日期

R:将列表的元素拆分为子列表

python - 是否可以查看 pytorchtext.data.Tabulardataset 的读取数据?

php - 操作系统错误: [Errno 22] Python PHP Problem

c# - 如何在迭代时从通用列表中删除元素?

c++ - 如何在 C++ 中声明对 lambda 的引用

c++ - lambda 参数列表中的类型可以引用未捕获的外部变量吗?

c# - 表达式<Action<T>> 方法调用

python - 合并两个文件,每行按整数排序,不读入内存也不排序