![](/img/trans.png)
[英]Apply function to each element in 3 lists of tuples to get 1 resultant list python3
[英]How to apply a function to a specific element in tuples in a list
我有一個([Char], Int, Int)
類型的元組列表,我想修改每個元組(_, x, _)
的第一個 integer 的值,以便該值枚舉項目從1開始:
function [("hi", 4, 2), ("hi", 27, 3) , ("moon", 9, 2)]
> result: [("hi", 1, 2), ("hi", 2, 3), ("moon", 3, 2)]
我怎樣才能做到這一點?
根據您的示例(文本確實令人困惑-我希望我可以稍微修復一下),您可以使用列表理解 + zip
:
enumItems :: [(String, Int, Int)] -> [(String, Int, Int)]
enumItems items = [ (str, i, n) | ((str,_,n), i) <- zip items [1..] ]
你的例子:
Prelude> enumItems [("hi", 4, 2), ("hi", 27,3) , ("moon", 9, 2)]
[("hi",1,2),("hi",2,3),("moon",3,2)]
如果您願意,還有zipWith
:
enumItems :: [(String, Int, Int)] -> [(String, Int, Int)]
enumItems items = zipWith (\(str, _, n) i -> (str, i, n)) items [1..]
如果你翻轉items
的順序和[1..]
你可以有一個很好的無點(意思是:不需要點items
)版本:
enumItems :: [(String, Int, Int)] -> [(String, Int, Int)]
enumItems = zipWith (\i (str, _, n) -> (str, i, n)) [1..]
這可能是我會使用的版本。
兩種變體都使用了一個巧妙的小技巧:由於 Haskell 是懶惰的,因此您可以在zip中無限列表[1..] = [1,2,3,4,...]
在任何列表[i1,i2,i3,...]
並得到對[(i1,1),(i2,2),...]
另一個列表的長度無關緊要。
AFAIK 也沒有像mapi
等變體。你有時會在其他語言中看到帶有索引的map
- 它總是那個技巧(至少我在這些情況下經常使用這個技巧)
Data.List.Index
中有indexed
,它允許您將索引附加到列表的每個元素。 因此,在您的情況下,您將得到一個[(Int, ([Char], b, c))]
,您只需編寫一個 function 來重新組織元組,如下所示:
import Data.List.Index (indexed)
rearrange (i,(s,_,j)) = (s,i,j)
function = map rearrange . indexed
input = [("hi", 4, 2), ("hi", 27, 3) , ("moon", 9, 2)]
result = function input
這樣,您就可以從 0 開始索引元素。如果您希望它們從 1 開始,您只需更改一位:
rearrange (i,(s,_,j)) = (s,i+1,j)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.