所以我有一个看起来像这样的表:
A B
A C
B A
C A
C B
我想删除已经表示两个值的连接的行(因此A ---- B是等效的连接,如B ---- A)。基本上我希望我的桌子看起来像这样。
A B
A C
B C
我如何在Ruby中执行此操作?
-Bobby
修改
这是我目前的代码:
require 'rubygems'
f = File.new("uniquename.txt","w")
i = IO.readlines('bioportnetwork.txt').collect{|l| l.split.sort}.uniq
i.each do |z|
f.write(z + "\n")
end
我尝试了这段代码,但我认为IO.readlines没有正确读取我的列。这是我桌子的一部分。
9722,9754 8755
8755 9722,9754
9722,9754 7970,7971
7970,7971 9722,9754
如何正确读取,然后正确保存为TSV文件?
-Bobby
答案 0 :(得分:3)
所以,假设您已将TSV文件加载到一对数组中:
arr = [["A", "B"], ["A", "C"], ["B", "A"], ["C", "A"], ["C", "B"]]
Hash[arr.map{|pair| [pair.sort, pair]}].values
#=> [["B", "A"], ["C", "A"], ["C", "B"]]
如果原始数组中的对的顺序不重要,则可以。
如果成对的元素顺序都不重要:
arr.map(&:sort).uniq
#=> [["A", "B"], ["A", "C"], ["B", "C"]]
答案 1 :(得分:1)
我假设'table'是指与此类似的数组数组:
x = [['A', 'B'],
['A', 'C'],
['B', 'A'],
['C', 'A'],
['C', 'B']]
如果是这样,您可以使用x.collect{|a| a.sort}.uniq
删除列表。
<强>更新强> 要从文件和数组中读取数据,请使用以下内容:
lines = IO.readlines('filename.txt')
x = []
lines.each {|l| x << l.split}
更新2: 或者,你可以对整个事情进行整理:
IO.readlines('test.txt').collect{|l| l.split.sort}.uniq
更新3:
写出文件时,请勿使用IO.write
。它会自动将数组转换为字符串,这可能是您遇到问题的地方。相反,请使用IO.puts
:
f.puts x[0].to_s << "\t" << x[1].to_s
答案 2 :(得分:1)
设置等价是在ruby中定义的,并且仅使用等效来检查新成员,因此您可以使用嵌套集结构来快速轻松地解决此问题。
set_of_all_sets = Set.new
file.each_line do |line|
line =~ /(\S)\s(\S)/
set_of_all_sets << Set.new([$1, $2])
end
array_of_all_sets.map{|set| set.to_a}