求问如何挑出 Association里面满足条件的部分
mathematica吧
全部回复
仅看楼主
level 3
我有一个Association, 类似这样 <|a -> 1, b -> 2, c -> 3, d -> 4|>, 我想挑出其中所有值为偶数的rule, 即想要得到的结果是<|b -> 2, d -> 4|>。
我试了下,Cases似乎不对Association内部不起作用,无论是
Cases[<|a -> 1, b -> 2, c -> 3, d -> 4|>, KeyValuePattern[ k_ -> v_?EvenQ] -> {k -> v}]
Cases[<|a -> 1, b -> 2, c -> 3, d -> 4|>, ( k_ -> v_?EvenQ) -> (k -> v)]
都不行。
但是用Normal将Association的类型转换成rule的List后倒是可以给出想要的结果
Cases[{a -> 1, b -> 2, c -> 3, d -> 4}, ( k_ -> v_?EvenQ) -> {k -> v}]
另外看帮助,试了下里面说的ReplaceAll+KeyValuePattern, 但没太搞明白, 貌似ReplaceAll+KeyValuePattern只会挑出第一个满足条件的rule ,不知道为什么。
所以就想问一下,Association这种数据结构,能直接实现类似Cases[{a -> 1, b -> 2, c -> 3, d -> 4}, ( k_ -> v_?EvenQ) -> {k -> v}]的功能吗? 还是说只能转换成List后才能做这些基本的操作?
2022年01月06日 05点01分 1
level 7
如帮助文件中所说,“对于很多运算,键是"透明"的”,很多函数对Association是重载了的。对于Cases函数,它只能“看到”关联的Value
Cases[<|a->1,b->2,c->3,d->4|>,_?EvenQ]
(*{2, 4}*)
Select也是类似的,但它的结果仍然是Association,所以可以满足楼主的需求
Select[<|a->1,b->2,c->3,d->4|>,EvenQ]
(*<|b -> 2, d -> 4|>*)
2022年01月06日 08点01分 2
啊,原来如此,谢谢!
2022年03月21日 06点03分
吧务
level 10
Association是原子类型,没有语言意义上的内部结构。相当多的情况确实要用Normal转换,少数情况可以直接用内置函数或者直接对关联进行模式匹配。
KeyValuePattern[...]匹配的是一个Association,而不是其中的键值对,所以你进行Replace就是把整个关联换成一个键值对。
2022年01月06日 10点01分 3
1