仅删除唯一元素

2023-12-14

有很多关于如何删除重复项和类似问题的资源,但我似乎无法找到任何有关删除唯一元素的资源。我正在使用 SWI-Prolog,但我不想使用内置程序来实现此目的。

也就是说,调用remove_unique([1, 2, 2, 3, 4, 5, 7, 6, 7], X).应该愉快地结果X = [2, 2, 7, 7].

显而易见的解决方案是类似的

count(_, [], 0) :- !.
count(E, [E | Es], A) :-
  S is A + 1,
  count(E, Es, S).
count(E, [_ | Es], A) :-
  count(E, Es, A).

is_unique(E, Xs) :-
  count(E, Xs, 1).

remove_unique(L, R) :- remove_unique(L, L, R).
remove_unique([], _, []) :- !.
remove_unique([X | Xs], O, R) :-
  is_unique(X, O), !,
  remove_unique(Xs, O, R).
remove_unique([X | Xs], O, [X | R]) :-
  remove_unique(Xs, O, R).

很快就会明白为什么这不是一个理想的解决方案:count is O(n)也是如此is_unique因为它只是使用count。我可以通过以下方式改进这个fail当我们找到多个元素但最坏情况仍然是O(n).

那么我们来到remove_unique。对于每个元素,我们检查当前元素是否is_unique in O。如果测试失败,该元素将被添加到下一个分支的结果列表中。运行O(n²),我们得到很多推论。虽然我认为在最坏的情况下我们无法加快速度,但我们能比这个简单的解决方案做得更好吗?我能清楚地看到的唯一改进就是改变count一旦识别出 >1 个元素就会失败。


Using tpartition/4if_/3 and (=)/3,我们定义remove_unique/2像这样:



remove_unique([], []).
remove_unique([E|Xs0], Ys0) :-
   tpartition(=(E), Xs0, Es, Xs),
   if_(Es = [], Ys0 = Ys, append([E|Es], Ys, Ys0)),
   remove_unique(Xs, Ys).
  

这是 OP 给出的示例查询:

?- remove_unique([1,2,2,3,4,5,7,6,7], Xs). 
Xs = [2,2,7,7].                       % succeeds deterministically
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅删除唯一元素 的相关文章

  • 按多个键分组并对字典列表的值进行汇总/平均值

    在Python中按多个键进行分组并对字典列表进行汇总 平均值的最Pythonic方法是什么 假设我有一个字典列表 如下所示 input dept 001 sku foo transId uniqueId1 qty 100 dept 001
  • Python 将列表追加到列表中

    我正在尝试编写一个通过矩阵的函数 当满足条件时 它会记住该位置 我从一个空列表开始 locations 当函数遍历行时 我使用以下方法附加坐标 locations append x locations append y 函数末尾的列表如下所
  • R:ifelse 中的字符串列表

    我正在寻找与 MySQL 中的 where var in 语句类似的东西 我的代码如下 data lt data frame id 10001 10030 cc1 rep c a b c 10 attach data data new lt
  • 如何在 flutter 中仅显示列表中的 5 项

    我想在 flutter 中显示一个列表 我正在使用listView 问题是我只想显示 5 个项目 我的意思是当用户向下滚动时我想从开始索引中删除并将另一个小部件添加到包含我的小部件的列表的末尾 但是当我这样做时ScrollView 不会停留
  • scala 返回列表中的第一个 Some

    我有一个清单l List T1 目前我正在执行以下操作 myfun T1 gt Option T2 val x Option T2 l map myfun l flatten find gt true The myfun函数返回 None
  • 迭代列表的奇怪速度差异

    我创建了两个重复两个不同值的长列表 在第一个列表中 值交替出现 在第二个列表中 一个值出现在另一个值之前 a1 object object 10 6 a2 a1 2 a1 1 2 然后我迭代它们 不对它们执行任何操作 for in a1 p
  • 如何在 R 中合并同名列表中的数据框?

    我有一个包含很多数据框的列表 如果它们具有相同的名称 我想合并它们 即合并所有具有相同名称 a 和 b 的数据框 像这样 a lt aaaaa b lt bbbbb c lt ccccc g lt list df1 lt data fram
  • C# List 内部结构

    将对象添加到集合 例如 List 时到底会发生什么 List
  • 大多数列表共有的项目

    给定一个列表列表 假设有 5 个列表 以便有一个可以使用的实数 我可以相对轻松地找到所有 5 个列表所共有的项目 请参阅使用 IEnumerable Intersect 求多个列表的交集 https stackoverflow com qu
  • 当顺序很重要时如何从元组列表中删除重复项

    我看过一些类似的答案 但我找不到针对这种情况的具体内容 我有一个元组列表 5 0 3 1 3 2 5 3 6 4 我想要的是仅当元组的第一个元素先前出现在列表中并且剩余的元组应该具有最小的第二个元素时 才从该列表中删除元组 所以输出应该是这
  • php如何生成动态list()?

    根据我的理解 这就是 list 的工作原理 list A1 A2 A3 array B1 B2 B3 所以在帮助下list 我们可以相应地从数组中分配值 这是我的问题 如何生成动态list 1 基于数据库返回结果 我不确定有多少 但我将其全
  • 使用 pandas 单元格中列表的长度选择行[重复]

    这个问题在这里已经有答案了 我有一张表 df a b c 1 x y x 2 x z c d 3 x t e f g 只是想知道如何使用 c 列的长度选择行 such as df loc len df c gt 1 我知道这是不对的 正确的
  • 查找 C# 列表中重复项的数量

    我在 C 中使用列表 代码如下 测试用例 cs public class TestCase private string scenarioID private string error public string ScenarioID ge
  • 对 numpy 数组中存在的元组中的列进行切片

    我已将一个文本文件导入到 numpy 数组中 如下所示 data np genfromtxt f dtype None delimiter names None 其中 f 包含我的 csv 文件的路径 现在数据包含以下内容 array 53
  • Python 中的密码子生成

    我有这段代码 用于将 DNA 字符串转换为密码子列表 然后将此列表转换为具有各自氨基酸的字符串 然而 当我运行代码并且 DNA 字符串以一对核苷酸 例如 CT 而不是三联体结尾时 代码不会生成氨基酸序列 正如您在输出中看到的 from co
  • 如何在 ISO Prolog 中定义(和命名)相应的安全术语比较谓词?

    标准术语顺序 ISO IEC 13211 1 7 2 术语顺序 针对所有术语 包括变量 进行定义 虽然这有很好的用途 想想实施setof 3 这使得 8 4 术语比较中内置函数的许多其他干净且合乎逻辑的使用成为声明式噩梦 到处都是 imps
  • Prolog 中的隔离列表

    我很难理解如何让我的代码显示由偶数和奇数组成的隔离列表 我什至不确定我的理解缺乏什么 显然我对这门语言很陌生 必须在学校使用它 我的命令式和功能性思维不会让我知道这到底是怎么回事 哈哈 现在 不 我不是要求你做我的作业 我只是请你帮我看看我
  • 为什么 list() == 1 给出结果,而 list() > 1 给出错误? [复制]

    这个问题在这里已经有答案了 即使这些比较没有意义 为什么 list 1 return False but list gt 1 return gt not supported between instances of list and int
  • 识别 2D 列表是否包含 Dart/Flutter 中的列表

    如何在不使用嵌套 for 循环的情况下识别 2D 列表是否包含另一个列表 我正在寻找类似的方法in在Python中 我尝试使用list contains x 但它似乎没有识别列表 List a 1 2 1 1 2 2 List b 1 2
  • 使用 prolog 添加另外两次出现

    我有一个清单 a b a a a c c 我需要为每个元素添加两次以上的出现 最终结果应该是这样的 a a a b b b a a a a a c c c c 如果列表中有一个与下一个项目相同的项目 那么它会继续下去 直到出现一个新项目 当

随机推荐

  • 如何更新另一个更新面板中的控件?

    我在层次结构中有三个更新面板 UpdatePanel1 Root UpdatePanelChild1 UpdatePanelChild2 我可以在 updatePanel2 发生事件时更新 updatePanel1 中的控件吗 我不太喜欢每
  • 如何将数组中的值添加到其前后的值

    我试图将数字数组转换为非零整数元素值的步骤 即 spread 0 0 n 0 0 returns gt 0 n 2 0 n 1 n 0 n 1 0 n 2 spread 0 0 0 n 0 2 returns gt 0 n 3 0 n 2
  • 针对性能不佳的 Lint 警告 - 80+ 次观看

    我收到此 lint 警告错误 highscores xml has more than 80 views bad for performance 这是我的高分表 有 15 行 3 列 这是我的应用程序的 Lite 版本 我的付费版本将容纳
  • 启动错误:java.lang.InknownClassChangeError:org/apache/struts2/convention/DefaultClassFinder$InfoBuildingVisitor

    我有一个 Struts2 应用程序 最初是基于 XML 的 但现在我第一次引入了基于注释的操作 并且该应用程序在启动时崩溃了 鉴于以下操作映射 在应用程序启动时 我收到错误 java lang InstantiationError com
  • python 字典 keyError

    python 新手 看起来像是简单可行的代码片段KeyError patt list jkasb dict for i in patt dict i 1 if dict i is None else dict i 1 This line t
  • 没有 StreamReader 构造函数接受字符串

    我正在将 NET 4 6 1 控制台应用程序移植到 NET Core 我安装了 NETStandard Library 1 6 但它不允许我将文件路径字符串传递到 StreamReader 构造函数中 查看定义确认它不可用 它去哪儿了 这是
  • 在Python中使用静态地址和偏移量从进程读取内存地址

    我正在尝试在 Python 中读取另一个进程的内存 并且我有程序的静态地址和所有偏移量 我正在使用win32api去做这个 我已经可以使用没有偏移量的地址读取进程的内存 但我不知道如何使用偏移量 我已经尝试过该脚本这个答案但它返回 1 我已
  • 使用 python 和 numpy 进行二维卷积

    我正在尝试使用 numpy 在 python 中执行二维卷积 我有一个二维数组 如下所示 内核 H r 代表行 H c 代表列 data np zeros nr nc dtype np float32 fill array with som
  • 如何在foreach迭代中修改多维数组的子元素

    我试图修改多维数组的每个数组元素中第一个子元素的内容 但是 如果我通过引用传递所述元素 则会收到错误消息 不是预期的 我是否需要放弃 foreach arr as list 语法并恢复到标准 for 循环并使用计数器变量进行访问 forea
  • 谷歌街景标题问题

    我正在从事一个项目 我需要显示走向道路的谷歌地图街景 我为全景对象设置了标题 0 但对于不同的位置 它显示的标题不同 例如 在某些情况下 它显示前往街道 而对于某些位置 它显示前往家 panorama theMap getStreetVie
  • 协助UI Dispatcher处理大量的方法调用

    以下帖子已成为bit 比预期更长 我对此表示歉意 但也许你会发现阅读起来很有趣 也许你有一个想法可以帮助我 我正在开发一个小型应用程序 其 GUI 由许多列表控件组成 每个列表控件都有一个thread与之相关的是永久生产正在添加到列表中的字
  • Android:SlidingDrawer的高度可以用wrap_content设置吗?

    我正在尝试实施一个SlidingDrawer将占据整个屏幕宽度 但其高度由其内容动态确定 换句话说 标准fill parent宽度和布局行为wrap content对于高度 这正是我在布局 XML 中指定的方式 见下文 但滑动抽屉始终打开到
  • 无法在 VBA (Excel) 中迭代哈希表

    我正在使用哈希表 引用 mscorlib dll 我用数据填充它 我可以获取任何项目 只要我将请求类型转换为与哈希表中存储的类型完全相同的类型 ContainsValue Key 所有这些都有效 但我无法通过 For Each 循环迭代它
  • 使用 Cython 将 malloc 缓冲区从 C 转换为 Python,而不进行复制?

    在 Cython 中 假设我有一个 C 函数 它返回一个使用 malloc 分配的大缓冲区 并预计稍后使用 free 释放 现在我需要将此缓冲区作为 字节 str 对象传递给 Python 它将获得它的所有权 并在 str 对象消失时调用
  • 检查字符串数组中的整数

    我正在尝试检查字符串数组是否存在转换后的整数 这位于一个过程中 其中 nc ecosite is an integer多变的 current consite是一个字符串数组 ecosite is an integer current eco
  • 如何用java模拟真实的鼠标点击?

    我正在尝试在 Java 中执行鼠标单击 以单击外部程序中的某些内容 为此 我正在使用java awt robot 以及以下代码 Robot bot new Robot int mask InputEvent MOUSE BUTTON1 DO
  • Delphi Android - 检测设备方向变化

    Delphi Android 开发新手 如何检测屏幕方向已更改 即从肖像到风景 反之亦然 发生这种情况时如何触发代码 例如 我有一个图像尺寸为 300x200 在纵向模式下 但当设备切换到横向时 我希望它调整并占据全屏宽度 在你的表单中实现
  • 如何降低 RealityKit 中阴影的不透明度?

    我在 Reality Composer 中构建了一个场景 并在其中添加了 3 个对象 问题是阴影太强烈 黑暗 我尝试使用 RealityKit 中的定向光this答案而不是 Reality Composer 中的默认灯光 因为您没有调整其中
  • 将所有链接与特定文本匹配

    我正在寻找 PHP 中的正则表达式 它将锚点与其上的特定文本相匹配 例如 我想获得带有文本 mylink 的锚点 例如 a href blabla mylink a 所以它应该匹配所有锚点 但前提是它们包含特定文本所以它应该匹配这些字符串
  • 仅删除唯一元素

    有很多关于如何删除重复项和类似问题的资源 但我似乎无法找到任何有关删除唯一元素的资源 我正在使用 SWI Prolog 但我不想使用内置程序来实现此目的 也就是说 调用remove unique 1 2 2 3 4 5 7 6 7 X 应该