我有一些关于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'实际上是一个字符串
谢谢。
答案 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
将始终大于或等于steps
(len(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]