gpt4 book ai didi

Scala - 从 List 中获取唯一值

转载 作者:行者123 更新时间:2023-12-03 18:12:11 25 4
gpt4 key购买 nike

我有一个这样的 list :

val l= List(("Agent", "PASS"), ("Agent", "FAIL"), ("Agent 1", "FAIL"), ("Agent", "PASS"), ("Agent 2", "PASS") )

我需要以这样的列表结束:
val filteredList= List(("Agent", "FAIL"), ("Agent 1", "FAIL"), ("Agent 2", "PASS") )

发生了什么?
("Agent", "PASS"), ("Agent", "FAIL")

变成
("Agent", "FAIL")

(因为如果至少有一个 FAIL,我需要保留该条目)

Agent 1 和 Agent 2 的条目保持不变,因为每个条目只有一个条目。

我找到的最接近的答案是
How in Scala to find unique items in List但我不知道如何将条目保留为 FAIL。

我希望问题很清楚,如果没有,我可以给你一个更好的例子。

谢谢

最佳答案

序言

我突然想到,状态可以被视为具有优先级,如果给定一个序列 (agent,status)配对,那么任务是为每个代理只选择最高优先级的状态。不幸的是,status 没有使用如此定义的显式排序进行强类型化,但是......因为它是一个只有两个值的字符串,我们可以安全地使用字符串排序作为与优先级 1:1 的对应关系。

我的两个答案都利用了两个有用的事实:

  • 在自然字符串排序中,"FAIL" < "PASS" , 所以:
    List("PASS", "FAIL", "PASS").sorted.head = "FAIL"
  • 对于两个元组 (x,a)(x,b) , (x,a) > (x, b)如果 (a > b)

  • 更新回复
    val solution = l.sorted.reverse.toMap

    转换 Seq[(A,B)] 时到 Map[A,B]通过 .toMap方法,原始元组序列中的每个“键”只能在结果 Map 中出现一次。碰巧,转换使用最后一次这样的事件。
    l.sorted.reverse = List(
    (Agent 2,PASS), // <-- Last "Agent 2"
    (Agent 1,FAIL), // <-- Last "Agent 1"
    (Agent,PASS),
    (Agent,PASS),
    (Agent,FAIL)) // <-- Last "Agent"

    l.sorted.reverse.toMap = Map(
    Agent 2 -> PASS,
    Agent 1 -> FAIL,
    Agent -> FAIL)

    原回复

    从答案开始...
    val oldSolution = (l groupBy (_._1)) mapValues {_.sorted.head._2}

    ...然后展示我的工作:)
    //group
    l groupBy (_._1) = Map(
    Agent 2 -> List((Agent 2,PASS)),
    Agent 1 -> List((Agent 1,FAIL)),
    Agent -> List((Agent,PASS), (Agent,FAIL), (Agent,PASS))
    )

    //extract values
    (l groupBy (_._1)) mapValues {_.map(_._2)} = Map(
    Agent 2 -> List(PASS),
    Agent 1 -> List(FAIL),
    Agent -> List(PASS, FAIL, PASS))

    //sort
    (l groupBy (_._1)) mapValues {_.map(_._2).sorted} = Map(
    Agent 2 -> List(PASS),
    Agent 1 -> List(FAIL),
    Agent -> List(FAIL, PASS, PASS))

    //head
    (l groupBy (_._1)) mapValues {_.map(_._2).sorted.head} = Map(
    Agent 2 -> PASS,
    Agent 1 -> FAIL,
    Agent -> FAIL)

    但是,您可以直接对 agent -> status 进行排序。无需先提取 _2 :
    //group & sort
    (l groupBy (_._1)) mapValues {_.sorted} = Map(
    Agent 2 -> List((Agent 2,PASS)),
    Agent 1 -> List((Agent 1,FAIL)),
    Agent -> List((Agent,FAIL), (Agent,PASS), (Agent,PASS)))

    //extract values
    (l groupBy (_._1)) mapValues {_.sorted.head._2} = Map(
    Agent 2 -> PASS,
    Agent 1 -> FAIL,
    Agent -> FAIL)

    在任何一种情况下,如果您愿意,请随时转换回对列表:
    l.sorted.reverse.toMap.toList = List(
    (Agent 2, PASS),
    (Agent 1, FAIL),
    (Agent, FAIL))

    关于Scala - 从 List 中获取唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4446949/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com