我对 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/