红宝石套装不是唯一的

时间:2017-06-14 08:00:48

标签: ruby set

由于某种原因,以下代码生成一个具有重复值的集合 我不确定如何定义ruby中数组的唯一性,所以这可能是某种可预期的?

require 'set'
xs = [1, 2, 3]
xss = Set.new []
xs.each do |x|
  xss.merge xss.to_a.map{|xs| xs.push x}
  xss.add [x]
  p xss
end

将打印

#<Set: {[1]}>
#<Set: {[1, 2], [1, 2], [2]}>
#<Set: {[1, 2, 3, 3], [1, 2, 3, 3], [2, 3], [1, 2, 3, 3], [2, 3], [3]}>

怎么了?

EDIT
xs.push x更改为xs + [x]即可解决问题。

1 个答案:

答案 0 :(得分:7)

您正在有效地更改集合中的对象,这是不允许的。

来自documentation

  

Set假定每个元素的标识在存储时不会更改。修改集合的元素会将集合渲染为不可靠状态。

关于comment

  

我想要a = [1, 2, 3] (1..a.size).flat_map { |n| a.combination(n).to_a } #=> [[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]

您可以使用Array#combination

Mu = pd.DataFrame()
lis = []
for date in daterange:
    path = 'Z:/directory/to/files' + date + '.txt'
    frame = pd.read_csv(path,delimiter=' ', skipinitialspace=True,usecols=[0,1,2,3], 
              names = ['date','time','type1','type2'],
              parse_dates = {'timestamp': ['date','time']})

    lis.append(frame)
Mu = pd.concat(lis, axis =0, ignore_index = True)