Другая опция состоит в том, чтобы использовать словарь со значениями, о которых Вы не заботитесь. Например,
poor_man_set = {}
poor_man_set[1] = None
poor_man_set[2] = None
poor_man_set[3] = None
...
можно рассматривать ключи как набор за исключением того, что они - просто массив:
keys = poor_man_set.keys()
print "Some key = %s" % keys[0]
побочный эффект А этого выбора состоит в том, что Ваш код будет назад совместим с более старым, пред - set
версии Python. Это - возможно, не лучший ответ, но это - другая опция.
Редактирование: можно даже сделать что-то вроде этого для сокрытия того, что Вы использовали dict вместо массива или установили:
poor_man_set = {}
poor_man_set[1] = None
poor_man_set[2] = None
poor_man_set[3] = None
poor_man_set = poor_man_set.keys()
s = "a#asg#sdfg#d##"
a = (0 ... s.length).find_all { |i| s[i,1] == '#' }
require 'enumerator' # Needed in 1.8.6 only
"1#3#a#".enum_for(:scan,/#/).map { Regexp.last_match.begin(0) }
#=> [1, 3, 5]
ETA: Это работает путем создания перечислителя, который использует сканирование (/ # /)
в качестве каждого метода.
сканирование дает каждое вхождение указанного шаблона (в в данном случае / # /
) и внутри блока вы можете вызвать Regexp.last_match для доступа к объекту MatchData для совпадения.
MatchData # begin (0)
возвращает индекс, с которого начинается совпадение, и, поскольку мы использовали карту в перечислителе, мы получаем обратно массив этих индексов.
Вот менее изощренный способ:
i = -1
all = []
while i = x.index('#',i+1)
all << i
end
all
В быстром тесте скорости это было примерно в 3,3 раза быстрее, чем метод find_all FM, и примерно в 2,5 раза быстрее, чем метод enum_for sepp2k.
Вот длинная цепочка методов:
"a#asg#sdfg#d##".
each_char.
each_with_index.
inject([]) do |indices, (char, idx)|
indices << idx if char == "#"
indices
end
# => [1, 5, 10, 12, 13]
требует 1.8.7+
Другое решение, полученное из ответа FMc:
s = "a#asg#sdfg#d##"
q = []
s.length.times {|i| q << i if s[i,1] == '#'}
Мне нравится, что у Ruby никогда не бывает только одного способа сделать что-то!