Сокращенный цикл for для перебора массива со значением и индексом

9

Есть ли удобный / сокращенный способ перебирать цикл for в массиве, получая как значение, так и индекс?

Основные варианты:

i = 1
for file in ["foo.csv", "bar.csv"]
    ...
   i += 1
end
files = ["foo.csv", "bar.csv"]
for i in 1:length(files)
   files[i]
end
Ян
источник

Ответы:

13

Редактировать: как указывает Мэтт Б, pairsон прост и безопасен для индексов (при использовании OffsetArrayименованного кортежа, словаря и т. Д.):

for (i, file) in pairs(["foo.csv", "bar.csv"])
    ...
end

Один из вариантов enumerate:

for (i, file) in enumerate(["foo.csv", "bar.csv"])
    ...
end

но обратите внимание, что перечисление не обязательно обеспечивает допустимые индексы, так как оно эффективно zip(x, countfrom(1))и будет ломаться для OffsetArrays.

Другой, безопасный для индекса, но требующий filesпеременной:

files = ["foo.csv", "bar.csv"]
for (i, file) in zip(eachindex(files), files)
    ...
end
Ян
источник
6
еще проще: pairs!
Мэтт Б.
это также работает для таких вещей, как словари и именованные кортежи и тому подобное.
Мэтт Б.