繁体   English   中英

不懂Python表达式

[英]Don't understand Python 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'实际上是一个字符串

谢谢。

我不明白的是代码:sa.sort(key = lambda i:t [i:i + steps])`

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

它根据子串t[i:i+len(t)]的自然排序对sa进行排序。 实际上i + steps总是大于或等于stepslen(t) )所以它可以写成t[i:]而不是(这使得代码更容易理解)

您将更好地理解使用decorate / sort / undecorate模式:

>>> 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]

和sf = t [sa [i]:sa [i] +步骤]

这也可以写得更简单:

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

您会注意到这正是上面的decorate / sort / undecorate示例中使用(然后丢弃)的键,所以整个事情可以重写为:

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(可读...)版本的代码;)

sortlambda定义了要对列表进行排序的条件。 换句话说,列表不会简单地根据其值进行排序,而是根据应用于值的函数进行排序。 看看这里了解更多细节。

看起来你正在做的是根据输入字符串t的子字符串的字母顺序对列表进行排序。

以下是发生的事情:

t = 'hello'   # EXAMPLE

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

sort_func = lambda i: t[i:i + steps]

for el in sa:
    print sort_func(el)

#ello
#hello
#llo
#lo
#o

所以这些是决定列表排序的值。

transf_list = [sort_func(el) for el in sa]
sorted(transf_list) 
# ['ello', 'hello', 'llo', 'lo', 'o']

因此:

sa.sort(key = sort_func)#I know that sa is a list
# [1, 0, 2, 3, 4]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM