【问题标题】:Don't understand Python Expression不懂 Python 表达式
【发布时间】:2017-04-20 13:41:53
【问题描述】:

我对 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'实际上是一个字符串

谢谢。

【问题讨论】:

  • 你能提供sasteps 的例子吗(我假设steps 是整数,但你知道他们对假设的看法......)?
  • @not_a_robot,别忘了tt 是这一切的中心,但我们不知道它是什么,大概是一个列表。
  • 打印出每个单独的表达式/变量,然后慢慢打印出越来越大的组合,直到打印出整个表达式。
  • 对不起,我编辑了代码并添加了一些代码(不是来自原始代码,但我添加它是为了帮助我更好地理解)
  • sa = [i for i in range(steps)] 只是编写sa = range(steps) (python 2.x) 或sa = list(range(steps)) (python 3.x) 的一种无用的复杂方式。

标签: python list lambda expression


【解决方案1】:

我不明白的是代码: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 总是大于或等于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]

和 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

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

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

【讨论】:

    【解决方案2】:

    sort 中的lambda 定义了列表排序依据的标准。 换句话说,列表不会简单地根据其值排序,而是根据应用于值的函数进行排序。 查看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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多