你能打破这个pythonic列表理解吗?

时间:2018-02-11 19:34:13

标签: python list-comprehension

在寻找有趣的方法来解决最长时间增长的子序列问题时,我遇到了这种列表理解:

def lis(a):
    L = []
    for (k,v) in enumerate(a):
        L.append(max([L[i] for (i,n) in enumerate(a[:k]) if n<v] or [[]], key=len) + [v])
    return max(L, key=len)

我试图理解它,但这是我理解它的最佳方式:

def lis(a):
    L = []
    for (k,v) in enumerate(a):
        for (i,n) in enumerate(a[:k]):
            if n < v:
                L.append(max(L[i]) + [v])
            else:
                L.append([[]])
        #L.append(max([L[i] for (i,n) in enumerate(a[:k]) if n<v] or [[]], key=len) + [v])
    return max(L, key=len)

但这是不正确的......任何帮助?谢谢。

编辑:

新代码:

def lis(a):
    L = []
    for (k,v) in enumerate(a):
        for (i,n) in enumerate(a[:k]):
            if n < v:
                L.append(max(L[i], key=len) + [v])
            else:
                L.append([[]] + [v])

当我在此列表中运行时:

a = [5, 2, 1, 5, 3, 2, 10, 2, 4, 2, 1, 0, 5]

我收到此错误:

  L.append(max(L[i], key=len) + [v])
TypeError: object of type 'int' has no len()

1 个答案:

答案 0 :(得分:2)

你在else语句中忘记了+ [v]

编辑(认为它是对的):

def lis(a):
    L = []
    for (k, v) in enumerate(a):
        tmp = []
        for (i, n) in enumerate(a[:k]):
            if n < v:
                tmp.append(L[i])
        if len(tmp) == 0:
            tmp = [[]]
        L.append(max(tmp, key=len) + [v])
    return max(L, key=len)