Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我能';我不能完全理解这行代码_Python_Python 3.x_Readability_Lis - Fatal编程技术网

Python 我能';我不能完全理解这行代码

Python 我能';我不能完全理解这行代码,python,python-3.x,readability,lis,Python,Python 3.x,Readability,Lis,我正在解决一个关于LIS的问题,但我不能完全解决它。我在谷歌上搜索了一些解决方案,在rosettacode上找到了几个。我喜欢这个,因为它看起来很短很直(所以更容易理解)。但它的写作方式让我在重写它时遇到了严重的困难 for i in range(len(d)): l.append(max([l[j] for j in range(i) if l[j][-1] < d[i]] or

我正在解决一个关于LIS的问题,但我不能完全解决它。我在谷歌上搜索了一些解决方案,在rosettacode上找到了几个。我喜欢这个,因为它看起来很短很直(所以更容易理解)。但它的写作方式让我在重写它时遇到了严重的困难

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]]
                )
范围内的i(len(d)):
l、 附加(最大值([l[j]表示范围(i)中的j)
如果l[j][1]
这是我很难理解的部分。这就是我认为我理解的:

向solutions数组追加solutions数组中最长的数字组合,该组合低于我从输入数组中考虑的当前数字;加上您正在考虑的输入数组中的数字。(对不起我的英语)

我觉得我没有完全理解代码在做什么

def longest_increasing_subsequence(d):
    'Return one of the L.I.S. of list d'
    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]])
    return max(l, key=len)

if __name__ == '__main__':
    for d in [[3,2,6,4,5,1], [0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]]:
        print('a L.I.S. of %s is %s' % (d, longest_increasing_subsequence(d)))
def最长递增子序列(d):
'返回列表d中的一个L.I.S.'
l=[]
对于范围内的i(len(d)):
l、 追加(最大值([l[j]表示范围(i)中的j,如果l[j][-1]
让我为您展开代码:

def longest_increasing_subsequence(d):
    'Return one of the L.I.S. of list d'
    l = []
    for i in range(len(d)):
        # currently the LIS is just this number
        lis_at_this_index = [d[i]]
        # for all the previous LIS
        for j in range(i):
            # if d[i] can be added to it and still be increasing
            if l[j][-1] < d[i]:

                # update the candidate LIS at this index
                lis_at_this_index = max(lis_at_this_index, l[j] + [d[i]], key=len)
        l.append(lis_at_this_index)
    # return the global maximum
    return max(l, key=len)
def最长递增子序列(d):
'返回列表d中的一个L.I.S.'
l=[]
对于范围内的i(len(d)):
#目前LIS就是这个号码
这个指数=[d[i]]
#对于所有以前的LIS
对于范围(i)中的j:
#如果d[i]可以加到它上面,并且仍然在增加
如果l[j][1]
其思想是,如果我们有索引[0..i-1]的LIS,我们可以计算索引
i
的LIS,如下所示:

  • 对于每个LIS[0…i-1],检查是否允许添加d[i]
  • 如果允许,则为索引i的候选LIS
  • 所有候选人中最长的是索引i处的LIS

  • 然后返回每个索引的所有LIS中最长的一个

    短代码不一定更可读!我建议将列表理解扩展到一个单独的嵌套
    for
    循环中,看看这是否有助于我重新格式化这行代码,使其更易于阅读。无论如何,将其重新编码为显式
    for
    循环和显式调用,而不是
    key=len
    。谢谢,我现在将学习并尝试理解它“可读性计数”