为什么我的Ruby`for`循环的效果不会持续存在?

时间:2015-12-08 23:46:59

标签: arrays ruby

我正在尝试将数字的各个数字的所有唯一组合放入数组中。我传入一个整数,然后使用置换方法。但要这样做,我相信我需要将数字参数转换为字符串。但是,当我遍历数组时,它没有加入字符串,以便我可以转换为整数。另外我意识到我应该使用each来执行循环而不是for但不知道如何在块中执行此操作。

def number_shuffle(number)
  combo = []
  combo = number.to_s.split("").permutation.to_a
  for i in combo
    i.join.to_i
  end
  return combo
end

我的循环有问题吗?当我使用combo[0].join.to_i测试数组中的一个项时,我得到一个整数作为输出。但由于某种原因,我的循环将这些作为字符串。

3 个答案:

答案 0 :(得分:2)

在您的示例尝试中,您无法修改数组的内容。我已经通过调用for替换了您的Array#map循环,def number_shuffle(number) permutations = number.to_s.split('').permutation numbers = permutations.map do |digits| digits.join.to_i end return numbers end number_shuffle 123 # => [123, 132, 213, 231, 312, 321] 的返回值包含按顺序包含每次迭代结果的新数组。这是您想要的方法的详细版本(为了清楚起见)。

split

如果您更喜欢单行(将chars替换为def number_shuffle(n) n.to_s.chars.permutation.map {|x| x.join.to_i } end ,请按下面的@timbetimbe):

from collections import defaultdict, OrderedDict
result_dict = defaultdict(OrderedDict)
data = [('Han Decane','12333'),('Can Decane','12333'),('AlRight','10110')]
for (v,k) in data:
   result_dict[k][v]=True


>>> list(result_dict['12333'].keys())
['Han Decane', 'Can Decane']

答案 1 :(得分:2)

你的for循环不会改变combo的原因是因为它对它没有任何作用。解释器只评估i.join.to_i,但不会编辑适当的值。

其次,您不需要在for的回复中使用returnsplit('')to_apermutation,因为它们不是真正惯用的方法。更简洁的方法是:

def number_shuffle(number)
  number.to_s.chars.permutation.map { |combo| combo.join.to_i }
end

推理:

  • 赞成each优先于for,因为它在社区中是首选。
  • 使用map中的permutation,因为它包含Enumerable(与Array相同),因此您可以直接跳到map
  • returns是隐含的,接受:)

Linters在入门时提供了极大的帮助:Rubocop

此样式指南由以下人员强制执行:bbatsov's Style Guide

答案 2 :(得分:1)

更快更有效(不必在内存中复制任何内容):

def number_shuffle(number)
  number.to_s.split('').permutation.to_a.map do |combination|
    combination.join.to_i
  end
end