【问题标题】:Filtering through a list of lists of strings to get a list of lists of strings with a certain length通过字符串列表的列表过滤得到具有一定长度的字符串列表的列表
【发布时间】:2019-11-12 22:21:07
【问题描述】:

我有以下函数,它接受两个列表并将每个元素与每个元素进行匹配,并返回一个字符串列表列表。

matchChars:: [t] -> [t] -> [[t]]
matchChars x y = [[a,b] | a<-x, b <-y]

现在我想修改函数,使列表列表中的字符串不会超过一定的长度。 例如:假设matchChars 产生输出[["aaa", "bbbb"],["c", "dd"]]。我想过滤掉两个字符串一起长度为 7 或更高的所有子列表。所以在这个例子中["aaa", "bbbb"] 会被过滤掉。

我已经试过了:

matchChars:: [t] -> [t] -> [[t]]
matchChars x y = takeWhile ((<= 7) . length) [[a,b] | a<-x, b <-y]

但这不起作用,因为它迭代子列表的长度而不是字符串长度。有人知道如何解决我的问题吗?

【问题讨论】:

  • 在我看来,正如目前所写的那样,matchChars 只能生成长度为 2 的列表。它似乎与 zip 非常相似,只是它返回一个短列表而不是列表对。这是你想要的吗?
  • @jpmarinier 我没有使用 zip,因为它不会将每个元素与每个元素匹配,并且只会压缩相同索引上的元素。
  • @RobinZigmond 我考虑过这一点,但我不想在匹配之前从 x 和 y 中删除 stringy ,因为如果我删除长度较小的字符串,我可能会以这种方式丢失有效的配对7.
  • @T.Naz 抱歉,我删除了我的评论,因为我意识到我误读了你想要达到的目标。
  • 您想要filter 结果列表(takeWhile 在条件失败时停止获取,即使后面的元素再次满足它)。您使用的谓词应采用列表[a, b] 并检查两个字符串的组合长度。提示足够了吗?

标签: haskell pattern-matching list-comprehension


【解决方案1】:

在你的情况下,我认为filtertakeWhile 更合适,就像罗宾一样。 像这样:

 λ> 
 λ> myFilter = filter (\[ls1, ls2] -> (7 > (length ls1 + length ls2)))
 λ> 
 λ> myFilter  [["aaa", "bbbb"],["c", "dd"]]
 [["c","dd"]]
 λ> 

函数takeWhile 仅用于获取满足您的谓词的初始且连续项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2017-05-10
    • 2015-12-23
    • 1970-01-01
    • 2017-04-23
    相关资源
    最近更新 更多