我对Haskell有点陌生,我试图生成列表的所有连续子列表。
我目前有以下几点:
listSublists :: [a] -> [[a]]
listSublists [] = [[]]
listSublists xs = [xs] ++ listSublists (init xs)
我知道上面的函数会在删除最后一个元素的情况下生成子列表,但我不知道如何完成伪代码。
我的伪代码基本上是,
拿着完整的清单,去掉尾巴。将(x:xs)的xs传递到列表子列表中
例如,xs=[1,2,3][xs]列表子列表(init xs)将生成[1,2,3,4]、[1,2,3]、[1,2]、[1]、[1]、[1],[1],我试图继续以xs的形式传入[2,3,4],直到列表用尽。
有人能给我指点指点吗?还是我的思维方式完全错了?
所有子列表(不一定连续):
sublists [] = [[]]
sublists (x:xs) = [x:sublist | sublist <- sublists xs] ++ sublists xs
仅连续子列表:
nub $ concat $ map tails $ inits ls
或
(:) [] $ filter (\x -> length x /= 0) $ concat $ map tails $ inits ls
您拥有的listSublists
函数在功能上几乎与inits
函数相同。您的思路是正确的,因为您当前可以列出给定列表的所有前缀。
你要问的是“什么是列表的子列表?”一个答案是它是列表前缀的后缀(即从列表的末尾砍掉一些部分,然后从列表的前面砍掉一些元素,这样就有了一个连续的子列表)。
因此,如果您有前缀
,那么您需要的是一种生成给定前缀(即某个列表)的所有后缀的方法。所以,如果你有
prefixes :: [a] -> [[a]]
prefixes [] = [[]]
prefixes xs = [xs] ++ prefixes (init xs)
您还需要相应的函数后缀
suffixes :: [a] -> [[a]]
suffixes [] = [[]]
suffixes xs = [xs] ++ suffixes (??? xs)
我将把它留给您来决定如何使用
。使用这两个函数,您只需获取所有前缀,并生成所有后缀即可获得所有连续的子列表
allSublists :: [a] -> [[a]]
allSublists = concat . map suffixes . prefixes
您可能想要删除结果集中的所有空列表,因为它们不是那么有趣的案例。
问题内容: 给出清单 我想遍历所有成对的连续列表项,即 我想以更紧凑的方式做到这一点,例如 有没有办法使用内置的Python迭代器来做到这一点?我确定该模块应该有解决方案,但我无法弄清楚。 问题答案: 只需使用拉链 如建议的那样,你可能会考虑在很长的列表中使用此函数,而这些列表又不想创建新列表。
假设您在python中输入了一个数字,并且希望生成一个连续数字列表,最多为,如 你怎么能这么做?
问题内容: 假设您在python中输入了数字,并且想生成一个连续数字列表,例如 你怎么能这样 问题答案: 在Python 3中,您可以像这样使用内置函数 注意1: Python 3.x的函数返回一个对象。如果需要列表,则需要使用答案中所示的功能将其显式转换为列表。 注意2: 我们将数字9传递给函数,因为,函数将生成直到给定数字但不包括数字的数字。因此,我们给出实际数字+ 1。 注意3: Pytho
问题内容: 我正在使用Python 2.7。 我有一个清单,我想要所有可能的有序组合。 这将给出以下输出: 但是我只希望输出是与列表相同顺序的组合。例如删除,,以及因为这些都不是正确的顺序相比列表。 我想通了用这个代替: 给我我想要的输出: 但是Python中是否有任何我想要的内置方法? 问题答案: 我相信您正在寻找的是原始列表中的所有可能 片段 。您所需的输出转换成切片是这样的: 因此,您应该尝
问题内容: 如何在Python中生成一个列表的所有排列,独立于该列表中元素的类型? 例如: 问题答案: 从Python 2.6(如果你使用的是Python 3)开始,你可以使用标准库工具:itertools.permutations。 如果你出于某种原因使用旧版Python(),或者只是想知道它的工作原理,那么这是一种不错的方法,取自 http://code.activestate.com/rec
问题内容: 这是问题: 给定Python中的项目列表,我将如何获得这些项目的所有可能组合? 这个站点上有几个类似的问题,建议使用itertools.combine,但是仅返回我需要的一部分: 如您所见,它仅按严格顺序返回项目,而不返回(2,1),(3,2),(3,1),(2、1、3),(3、1、2),( 2,3,1)和(3,2,1)。有一些解决方法吗?我似乎什么都没想。 问题答案: 用途: 帮助: