第四行代码的目的是什么,特别是“l [j] [ - 1]”?

时间:2015-08-08 12:18:41

标签: python

ff是一个代码,用于查找数组/列表中增长最长的子序列,在这种情况下,它是d。第4行让我感到困惑,就像l[j][-1]的含义一样。我们说i = 1。 l[j][-1]会是什么?

d = [10,300,40,43,2,69]
l = []
for i in range(len(d)):
    l.append(max([l[j] for j in range(i) if l[j][-1] < d[i]] or [[]], key=len) + [d[i]])

2 个答案:

答案 0 :(得分:4)

当我点击这样的东西时,我认为要么我面对的是一个超出我琐碎理解的智能算法,要么我只是看到有人写的严密的代码,而他们的头脑已经充满了手头的问题,而不考虑那个后来试图读它的人(那个人经常是作家本人,六个月后......除非他是APL黑客......)。

所以我接受代码并尝试反混淆它。我将其复制/粘贴到我的文本编辑器中,然后从那里重新编写它以将复杂的语句或表达式拆分为较小的语句,并将中间值分配给具有有意义名称的变量。我迭代地这样做,一次剥离一层卷积,直到结果对我有意义。

我为你的代码做了那件事。我相信你会很容易理解这种形状。而且我不太熟悉Python,我为自己的理解评论了一些事情,至少和你的一样。

这个结果代码可以使用一些重新排序和简化,但我留下的形式最容易映射到原始的四线,这是其扩展的直接结果。我们走了:

win_unicode_console.enable()

答案 1 :(得分:2)

这对我来说就像是蟒蛇。

max(arg1, arg2, *args[, key])

返回可迭代中的最大项或两个或多个参数中的最大项。

如果提供了一个位置参数,则iterable必须是非空的可迭代(例如非空字符串,元组或列表)。返回iterable中的最大项。如果提供了两个或多个位置参数,则返回最大的位置参数。

可选的key参数指定一个单参数排序函数,就像用于list.sort()的函数一样。密钥参数(如果提供)必须采用关键字形式(例如,max(a,b,c,key=func))。

在这种情况下,似乎变量l = []将附加最大函数内部内容中最大的可迭代或最大的两个参数。

iterable 1:

[l[j] for j in range(i) if l[j][-1] < d[i]]
or
[[]]

有时用语言也有帮助:

j in l for j in range i if j in l times -1 is less than i in d or [[]]

iterable 2:

key=len

[d[i]]添加到返回最大结果

的那个

将此结果附加到l = [] l = [result]

追加只是将一个项目添加到列表的末尾;相当于a[len(a):] = [x]