我有一个像这样的元组列表:
[("username", 123), ("df", 54), ("as",2 34)]
我需要根据用户名搜索值。我使用查找但我需要更改整数的值并写回文件。我的逻辑是删除元组并插入另一个新的元组值而不是更改它。
知道怎么做吗?
答案 0 :(得分:15)
像这样使用 Data.Map :
import qualified Data.Map as Map
m1 :: Map String Int
m1 = Map.fromList [("username", 123), ("df", 54), ("as",234)]
让我们将54替换为78(在“df”上):
m2 = Map.insert "df" 78 m1
您可以使用insertWith'将旧值和新值与函数组合。
这里我们在“用户名”上插入4,并将4添加到“用户名”指向的任何值。
m3 = Map.insertWith (+) "username" 4 m1
如果您确定某个键位于地图中,则可以使用(!)运算符访问其值:
import Data.Map ((!))
m3 ! "username"
给出了127
。但要注意,如果密钥不在地图中,它可能会引发异常!
安全查询:
Map.lookup :: Map k a -> k -> Maybe a
Map.lookup "usrname" m3
密钥上有拼写错误,因此会返回Nothing
。
答案 1 :(得分:1)
repList old new xs = map (\v@(x,y) -> if x == old then (new,y) else v) xs
答案 2 :(得分:0)
如果使用Data.Map类型,则可以使用
之类的函数updatedMap = Data.Map.updateWithKey (\_ _ -> Just 234) "username" myMap
按照您给出列表的方式,您必须通过类似
的方式构建地图myMap = Data.Map.fromList (map (\ (a,b) -> (b,a)) datalist)
最后,您可以使用Data.Map.toList将事物返回到值列表。