Python:编写非常复杂的代码作为列表理解

如何解决Python:编写非常复杂的代码作为列表理解

我已通过以下代码解决Word Break问题:

def wordBreak(self,s: str,wordDict: List[str]) -> bool:
        n = len(s)
        dp = [False] * n
        for i in range(n):
            for j in range(i + 1,n + 1):
                if (s[i : j] in wordDict) and (i == 0 or dp[i - 1]):
                    dp[j - 1] = True
        return dp[n - 1]

我正在尝试将其编写为列表理解,以使其成为“或多或少的单行代码”。

我一直试图表达dp如下:

dp = [True if (s[i:j] in wordDict) and (i==0 or dp[i-1]) for j in range(i+1,n+1) for i in range(n) else False]

但是,我有点卡住了,因为在原始代码中将其设置为dp[j - 1] = True,而我无法通过列表理解来实现它。

我知道写一个代码作为列表理解并不是一个好主意(我也很困惑),但这只是出于教育目的。

对于正确编写此列表理解的任何帮助,我们深表感谢。

解决方法

实际上,不仅要写入dp,而且还要在下一次迭代中再次读取这些新写入的值,所以它不适合用于列表理解。 但是,如果您愿意牺牲一些Python最佳实践,则可以接近。

首先,您可以将内部循环转换为列表理解:

def wordBreak(self,s: str,wordDict: List[str]) -> bool:
    n = len(s)
    dp = [False] * n
    for i in range(n):
        dp[i:] = [dp[j] or
                   (s[i:j+1] in wordDict) and (i == 0 or dp[i-1])
                   for j in range(i,n)]
    return dp[-1]

让我们稍微改变一下算法,所以列表覆盖从索引0开始,而不是从索引i开始。相反,我们逐渐缩短了名单。同时,我们将dp[0]指定为要从先前迭代中读取的值,因此我们也将其前缀为初始列表:

def wordBreak(self,wordDict: List[str]) -> bool:
    n = len(s)
    dp = [True] + [False] * n
    for i in range(n):
        dp = [dp[j-i+1] or s[i:j+1] in wordDict and dp[0]
                   for j in range(i,n)]
    return dp[0]

但是dp = 是一种原则上阻止列表理解更广泛使用的赋值。 您可以使用a-Pythonic函数解决此问题,该函数会更改并返回一些内容:

def assign(self,target,source):
    target[:] = source  # mutate the target
    return target[-1]  # for our purposes we only need it to return the last value

现在我们可以将其包含在更大的列表理解表达式中:

def wordBreak(self,wordDict: List[str]) -> bool:
    n = len(s)
    dp = [True] + [False] * n
    return [
        self.assign(dp,[dp[j-i+1] or s[i:j+1] in wordDict and dp[0]
                        for j in range(i,n)])
                        for i in range(n)
    ][-1]

但是要重复一遍:这不是pythonic。最佳做法是让函数更改参数(或self),返回值,但不能同时返回值。该规则只有少数例外(例如.pop()

如果您对函数表达式感到满意,而不是列表理解,则可以使用functools.reduce

def wordBreak(self,wordDict: List[str]) -> bool:
    n = len(s)
    return reduce(lambda dp,i: [dp[j-i+1] or s[i:j+1] in wordDict and dp[0]
                                 for j in range(i,n)],range(n),[True] + [False] * n)[0]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?