根据字段子集的列表中的唯一元素

     2023-03-29     187

关键词:

【中文标题】根据字段子集的列表中的唯一元素【英文标题】:Unique elements from a list according to a subset of fields 【发布时间】:2021-08-07 10:20:44 【问题描述】:

给定一个类似的记录

data Foo = Foo  fooName :: Text, fooAge :: Int, fooCity :: Text 

有了这些元素的列表,在这个假设的removeDupBy 函数的模型上,是否有一个函数可以仅删除字段子集上的重复项?

foos =
  [
    Foo "john" 32 "London",
    Foo "joe" 18 "New York",
    Foo "john" 22 "Paris",
    Foo "john" 32 "Madrid",
    Foo "joe" 17 "Los Angeles",
    Foo "joe" 18 "Berlin"
  ]

> removeDupBy (\(Foo f) -> (fooName, fooAge)) foos 
[
    Foo "john" 32 "London",
    Foo "joe" 18 "New York",
    Foo "john" 22 "Paris",
    Foo "joe" 17 "Los Angeles"
]

我可以实现自己的,但更喜欢使用成熟库中的一个,它可能会性能更高,并且对边缘情况更有弹性。我正在考虑使用nub,但我不确定如何将实际的Foo 元素映射到nub 将过滤掉的元组(fooName, fooAge)

【问题讨论】:

nubOrdOn 来自containers。 刚刚发现the history of nubOrd / nubOrdOn 【参考方案1】:

由于您只处理字符串和数字,因此您可以使用Ord 实例来有效地删除重复项,甚至可以使用Hashable,它允许几乎恒定时间的查找。

与您想要的签名完全匹配的一些函数是:

    nubOrdOn 来自 containers 包
Data.Containers.ListUtils> nubOrdOn (\f -> (fooName f, fooAge f)) foos
    hashNubOn 来自 witherable 包
Witherable> hashNubOn (\f -> (fooName f, fooAge f)) foos

您可以通过在Hoogle 上搜索(a -> b) -> [a] -> [a] 来找到其他选项

如果你需要做很多这样的操作,你可能更喜欢直接使用MapHashMap

【讨论】:

【参考方案2】:

你可以使用nubBy:

Prelude Data.List> nubBy (\x y -> (fooName x, fooAge x) == (fooName y, fooAge y)) foos
[Foo fooName = "john", fooAge = 32, fooCity = "London",
 Foo fooName = "joe", fooAge = 18, fooCity = "New York",
 Foo fooName = "john", fooAge = 22, fooCity = "Paris",
 Foo fooName = "joe", fooAge = 17, fooCity = "Los Angeles"]

(为提高可读性而格式化的输出)

【讨论】:

这个算法是 O(n^2),但如果使用 OrdHashable 实例,它可能是 O(n log n)。 @4castle 你会使用Ord/HashablenubBy 还是需要使用nubOrdOn @Jivan 它必须具有不同的功能,例如nubOrdOn,或者您可以使用Map/HashMap(全部插入,然后读出值)跨度>

根据列表中的值更改 xml 字段值

】根据列表中的值更改xml字段值【英文标题】:Changexmlfieldvaluedependingonvaluesfromlist【发布时间】:2017-02-2108:46:14【问题描述】:我有一个包含多个字段的XML文件。其中一个字段是参考编号(唯一)。另一个字段是profile-id(不是唯... 查看详情

Python Pandas:有没有办法根据列表中的字符串获取子集数据帧

】PythonPandas:有没有办法根据列表中的字符串获取子集数据帧【英文标题】:PythonPandas:Isthereawaytoobtainasubsetdataframebasedonstringsinalist【发布时间】:2022-01-1502:00:28【问题描述】:我希望根据列表中的字符串值创建一个子集df。玩具... 查看详情

检查列表中的所有元素是不是唯一

】检查列表中的所有元素是不是唯一【英文标题】:Checkingifallelementsinalistareunique检查列表中的所有元素是否唯一【发布时间】:2011-07-1318:47:10【问题描述】:检查列表中的所有元素是否唯一的最佳方法是什么(最好是传统方法... 查看详情

根据下拉列表中的选定值显示表单字段Angular TypeScript

】根据下拉列表中的选定值显示表单字段AngularTypeScript【英文标题】:Displayaformfieldaccordingtotheselectedvalueinadrop-downlistAngularTypeScript【发布时间】:2019-04-1714:03:30【问题描述】:我想根据表单下拉列表中选择的值显示一个表单域。... 查看详情

haskell 列表中的唯一元素

】haskell列表中的唯一元素【英文标题】:uniqueelementsinahaskelllist【发布时间】:2011-03-0702:50:02【问题描述】:好的,这可能会在前奏中出现,但是:是否有标准库函数用于查找列表中的唯一元素?为了澄清,我的(重新)实现是... 查看详情

生成子集集和未使用的元素

】生成子集集和未使用的元素【英文标题】:Generatesetsofsubsetsplusunusedelements【发布时间】:2021-02-2121:57:54【问题描述】:我想要一个python程序,它接受一个整数列表并返回一个包含子集的元组列表的列表以及包含第一个子集中未... 查看详情

列表中的唯一元素(Prolog)

】列表中的唯一元素(Prolog)【英文标题】:Uniqueelementsinlist(Prolog)【发布时间】:2011-05-2313:55:57【问题描述】:我正在实施爱因斯坦谜语的变体,但遇到了一些麻烦。当尝试计算解决方案时,我尝试这样做:solve(Street):-Street=[_Ho... 查看详情

比较 JSP 中两个列表的元素并根据比较隐藏字段

】比较JSP中两个列表的元素并根据比较隐藏字段【英文标题】:CompareelementsoftwolistsinJSPandhidefieldsbasedoncomparison【发布时间】:2020-06-1513:25:10【问题描述】:我有两个列表。两者都有字符串消息。列表A包含所有消息,列表B包含列... 查看详情

java示例代码_从Lucene中的特定字段获取唯一术语列表

java示例代码_从Lucene中的特定字段获取唯一术语列表 查看详情

如何仅为列表中的项目子集提供披露按钮?

...re设置为TRUE会为列表中的所有项目启用此选项。但我只想根据特定条件为子集启用它。非 查看详情

根据唯一 ID 列表删除 Big Query 表中的批量行

】根据唯一ID列表删除BigQuery表中的批量行【英文标题】:DeletebulkrowsinBigQuerytablebasedonlistofuniqueids【发布时间】:2021-01-2518:00:39【问题描述】:所以我尝试用这样的简单查询删除BigQuery表中的一些行:client=bigquery.Client()query="DELETEFR... 查看详情

检查元组列表中的所有第一个元素是不是满足条件

...足条件【发布时间】:2021-12-0705:45:27【问题描述】:我想根据元组中的第一个元素检查一个列表是否是另一个列表的子集。subset(List((\'a\',1),(\'b\',2),(\'c\',3)),List((\'a\' 查看详情

根据长度过滤子集?

】根据长度过滤子集?【英文标题】:Filtersubsetsbasedonlength?【发布时间】:2020-02-0407:56:09【问题描述】:尝试使用过滤器提取长度为k的子集。不知道如何处理它?该列表有100个元素。subsets::[a]->[[a]]subsets[]=[[]]subsets(x:xs)=[zs|ys<... 查看详情

从 Python 中的多个列表中仅选择一个唯一元素

】从Python中的多个列表中仅选择一个唯一元素【英文标题】:SelectonlyoneuniqueelementfrommultiplelistsinPython【发布时间】:2020-02-2607:53:06【问题描述】:这不是我正在努力做的家庭作业,但我正在努力解决一个问题(如果有兴趣,请点... 查看详情

根据字典映射表替换列表中的元素

】根据字典映射表替换列表中的元素【英文标题】:Replaceelementsinlistbasedonadictionarymappingtable【发布时间】:2021-09-1818:26:54【问题描述】:我想根据字典映射表替换列表列表中的元素,并尝试如下:lists_before=[[\'A\',\'B\',\'C\'],[\'A\',\... 查看详情

选择列表中的最低元素[重复]

...uplicate]【发布时间】:2019-06-0112:42:04【问题描述】:我想根据大小选择媒体,但似乎无法弄清楚如何以一种聪明的方式选择内存消耗最低的媒体。内存使用情况存储在Size字段中。usingSystem;usingSystem.Collections.Generic;structplaceholderstri... 查看详情

SQL:根据最近的日期选择一个字段中的值是唯一的记录

】SQL:根据最近的日期选择一个字段中的值是唯一的记录【英文标题】:SQL:Selectingrecordwherevaluesinonefieldareuniquebasedoffofmostrecentdate【发布时间】:2020-12-0822:31:42【问题描述】:我正在尝试编写一条SQL语句来选择记录,以便每条记... 查看详情

根据列表中的两个元素计算列表列表的平均值?

】根据列表中的两个元素计算列表列表的平均值?【英文标题】:Calculatetheaverageoflistoflistsbasedontwoelementsinthelist?【发布时间】:2021-09-2917:11:00【问题描述】:我有以下清单:mylist:[[(5,1,11),(5,2,13),(5,3,26),(3,1,60),(3,2,40),(3,3,70),(6,1,30),... 查看详情