Jaki jest najprostszy sposób na konwersjęJak zmapować z indeksem w Ruby?
[x1, x2, x3, ... , xN]
do
[[x1, 2], [x2, 3], [x3, 4], ... , [xN, N+1]]
Jaki jest najprostszy sposób na konwersjęJak zmapować z indeksem w Ruby?
[x1, x2, x3, ... , xN]
do
[[x1, 2], [x2, 3], [x3, 4], ... , [xN, N+1]]
Jeśli używasz Ruby 1.8.7 lub 1.9, można skorzystać z faktu, że metody iteracyjnej jak each_with_index
, gdy wywołana bez blok, zwróć obiekt Enumerator
, który możesz wywołać na Enumerable
metodach takich jak map
. Więc można zrobić:
arr.each_with_index.map { |x,i| [x, i+2] }
W 1.8.6 można zrobić:
require 'enumerator'
arr.enum_for(:each_with_index).map { |x,i| [x, i+2] }
Oto dwie kolejne opcje 1.8.6 (lub 1.9) bez użycia wyliczający:
# Fun with functional
arr = ('a'..'g').to_a
arr.zip((2..(arr.length+2)).to_a)
#=> [["a", 2], ["b", 3], ["c", 4], ["d", 5], ["e", 6], ["f", 7], ["g", 8]]
# The simplest
n = 1
arr.map{ |c| [c, n+=1 ] }
#=> [["a", 2], ["b", 3], ["c", 4], ["d", 5], ["e", 6], ["f", 7], ["g", 8]]
Over the top zaciemnianie:
arr = ('a'..'g').to_a
indexes = arr.each_index.map(&2.method(:+))
arr.zip(indexes)
Podoba mi się ten jeden, niejasny kod jest zawsze zabawny w utrzymaniu. –
Andrew musi mieć świetną ochronę pracy! :) –
Ruby> = 1.9.3 ma Enumerator#with_index(offset = 0). Aby przekonwertować tablicę do wyliczający, użyj Object#to_enum lub Array#map, co czuje się bardziej deklaratywny wam:
[:a, :b, :c].map.with_index(2).to_a
#=> [[:a, 2], [:b, 3], [:c, 4]]
To jest najlepsza odpowiedź do tej pory! –
Bardzo eleganckie rozwiązanie, dzięki! – dolzenko
Wierzę, że to jest lepsza odpowiedź, ponieważ będzie działać z mapą! 'foo = ['d'] * 5; foo.map! .with_index {| x, i | x * i}; foo # => ["", "d", "dd", "ddd", "dddd"] ' –
a = [1, 2, 3]
p [a, (2...a.size+2).to_a].transpose
module Enumerable
def map_with_index(&block)
i = 0
self.map { |val|
val = block.call(val, i)
i += 1
val
}
end
end
["foo", "bar"].map_with_index {|item, index| [item, index] } => [["foo", 0], ["bar", 1]]
OMG! Czy przeczytałeś jeszcze inne odpowiedzi? 'map.with_index' już istnieje w ruby. Po co proponować ponowne otwarcie klasy przeliczalnej i dodać coś, co już istnieje? – nathanvda
To może być łatwiejszy sposób, aby przejść do wersji 1.8.6 i 1.8.7 (tak, niektórzy z nas nadal go używają) zamiast używać dziwniejszych rzeczy, takich jak 'each_with_index.map' itd., A nawet ci z nas w nowszych wersjach mogą wolę używać map.with_index FWIW :) – rogerdpack
I często to zrobić:
arr = ["a", "b", "c"]
(0...arr.length).map do |int|
[arr[int], int + 2]
end
#=> [["a", 2], ["b", 3], ["c", 4]]
Zamiast bezpośrednio kolejno po elementy tablicy, iterujesz na zakresie liczb całkowitych i używasz ich jako indeksów do pobierania elementów tablicy.
Jeśli czytasz inne odpowiedzi, mam nadzieję, że teraz zdajesz sobie sprawę, że istnieją lepsze podejścia. Więc nie wiesz, dlaczego musisz to dodać. – nathanvda
Jeśli odpowiedź Andrew Grimm zasługuje na dziesięć głosów, to ta zasługuje na co najmniej jedną! –
Myślę, że powinieneś wrzucić pętlę for na dobrą miarę;) –
zabawy, ale bezużyteczny sposobem, aby to zrobić:
az = ('a'..'z').to_a
azz = az.map{|e| [e, az.index(e)+2]}
Dlaczego nienawiść? Jest to funkcjonujący sposób robienia tego, a nawet mówię, że to głupi sposób na osiągnięcie rezultatów. – Automatico
wywołanie #index oznacza, że jest to teraz pętla O (N^2), także dlaczego +2? :) – rogerdpack
Kiedy piszę "Zabawa, ale bezużyteczny sposób". '+ 2' służy do utworzenia wyniku, o który OP prosi o – Automatico
W Ruby 1.9.3 jest chainable metoda zwana with_index
które mogą być przykuty do map.
Na przykład: array.map.with_index { |item, index| ... }
Zawsze podobało mi składnię tego stylu:
a = [1, 2, 3, 4]
a.each_with_index.map { |el, index| el + index }
# => [1, 3, 5, 7]
Wywoływanie each_with_index
dostaje moduł wyliczający można łatwo mapę nad z indeksu dostępne.
, w jaki sposób jest to inna forma [odpowiedź, udzielona prawie 5 lat przed twoją] (http://stackoverflow.com/a/4697573/1772830)? –
Dzięki! Czy możesz dać mi wskaźnik do dokumentacji dla '.each_with_index.map'? –
W takim przypadku 'map' jest funkcją czego? –
@Misha: 'map' to jak zwykle metoda' Enumerable'. 'each_with_index', po wywołaniu bez bloku, zwraca obiekt' Enumerator' (w wersji 1.8.7+), który miksuje w 'Enumerable', dzięki czemu możesz wywołać' map', 'select',' reject' itp. tak jak na tablicy, haszym, zasięgu itp. – sepp2k