Создание нового списка, который добавляет и суммирует элементы из старого списка
У меня есть список xxs
, и мне нужно создать новый, который добавляет и суммирует элементы из старого списка.
Позвольте мне сделать это, чтобы продемонстрировать:
![visualization of list transformation]()
Итак, у меня есть список:
xxs = [("a","b", [(1,"a","b"),(2,"a","b")]), ("c","d",[(3,"a","b"),(4,"a","b")])]
Мой лучший подход до сих пор:
infoBasicas = [ (x,y,aux) | (x,y,_) <- xxs]
where aux = sum [ z | (_,_,ys) <- xxs, (z,_,_) <- ys]
Вывод:
[("a","b",10),("c","d",10)]
Хотя Im не за горами... Я еще не совсем там и буду очень благодарен за некоторые предложения.
Ответы
Ответ 1
Проблема с вашим решением заключается в том, что aux
одинаково для каждого элемента xxs
. когда вы пишете (x,y,_) <- xxs
, вы выбрасываете список с числами, которые вы хотите суммировать. Вместо этого сохраните этот список, работая по одному элементу за раз, поэтому:
infoBasicas = [(x, y, doSum innerList) | (x, y, innerList) <- xxs]
Чтобы найти сумму innerList
s, вам нужны только цифры, поэтому вы можете их выбросить. После этого вы получите список чисел, который можно просто суммировать со стандартной функцией sum
:
doSum list = sum (fst3 list) -- There is one small error here. Can you see what it is?
fst3 (a, _, _) = a
Не то, что мы используем fst3
здесь вместо fst
, поскольку это тройки, а не пары.
Ответ 2
Вы были очень близки!
Как сказал gereeter: ваша главная проблема в том, что вы используете то же значение aux
для всего. Если вы измените aux
на функцию, берущую список кортежей (Int,String,String)
, то она должна работать для вас.
infoBasicas = [ (x,y,aux z) | (x,y,z) <- xxs ]
where aux xs = sum [ z | (z,_,_) <- xs ]
(Я вообще ничего не добавил к запросу gereeter, кроме как изменить форму кода примера, чтобы более точно походить на ваш.)