不懂Python表达式

时间:2017-04-20 13:41:53

标签: 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'实际上是一个字符串

谢谢。

2 个答案:

答案 0 :(得分:2)

  

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

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

根据子串sa的自然顺序对t[i:i+len(t)]进行排序。实际上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(可读...)版本的代码;)

答案 1 :(得分:1)

lambda中的sort定义了要对列表进行排序的条件。 换句话说,列表不会简单地根据其值进行排序,而是根据应用于值的函数进行排序。  有关详细信息,请查看here

看起来你正在做的是根据输入字符串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]