Как выбрать элемент из кортежа по индексу в списке? - PullRequest
0 голосов
/ 01 мая 2018

Я хочу выбрать элементы из списка, [[1,2], [3,4], [5,6]] один раз первый, затем второй, затем снова первый и так далее. Я подумал, что мог бы использовать zip, чтобы добавить счетчик перед парами, и использовать модуль по модулю, чтобы выбрать деталь, и теперь мой список выглядит так:

let a = [(0,[1,2]),(1,[3,4]),(2,[5,6]),(3,[7,8]),(4,[9,10])]

а как теперь выбрать элементы?

псевдокод будет

for each tuple in list:
      first part of tuple is the selector, second part is the pair
      if selector mod 2 : choose pair[0] else choose pair[1]

вывод для списка a должен быть: 1,4,5,7,9

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Мне очень нравится @DanielWagner. Первый так прост и эффективен. Его второе немного сложнее для понимания, но также и простое. Когда теории просты, это увеличивает их достоверность. Вот мое извиняющееся решение, но оно использует вашу структуру. (Списки ассоциаций - это кортежи. Было предложено использовать кортежи, но для этого то, что у вас есть и, вероятно, нужно, это нормально.)

a = [(0,[1,2]),(1,[3,4]),(2,[5,6]),(3,[7,8]),(4,[9,10])]

[if even i then x else y | (i,(x:y:z)) <- a]

[1,4,5,8,9]
0 голосов
/ 01 мая 2018

Возможно:

> zipWith (!!) [[1,2],[3,4],[5,6],[7,8],[9,10]] (cycle [0,1])
[1,4,5,8,9]

Если вы знаете, что работаете со списками длины два внутри, вам, вероятно, следует использовать вместо них пары.

> zipWith ($) (cycle [fst, snd]) [(1,2),(3,4),(5,6),(7,8),(9,10)]
[1,4,5,8,9]
...