我試圖找出一種有效的方法來從字串陣列中洗掉重復項,但不是在單個陣列中,而是從所有陣列中洗掉重復項。
這很難解釋,所以讓我舉個例子:
[
["Word1", "Word2", "Word3", "Word4"],
["Word1", "Word5", "Word3", "Word4"],
["Word1", "Word2", "Word3", "Word7"],
]
預期成績:
[
["Word2", "Word4"],
["Word5", "Word4"],
["Word2", "Word7"],
]
索引 0:洗掉,因為所有索引 0 都是相同的。
索引 1:保留,因為并非所有索引 1 都是相同的。等等...
我離得越近是
def clean_duplicates(attributes)
valid_attributes = attributes.map { [] }
attributes.first.count.times.each do |i|
next if attributes.all? { |v_attrs| v_attrs[i] == attributes.last[i] }
attributes.each_with_index do |_, v|
valid_attributes[v].push(attributes[v][i])
end
end
valid_attributes
end
clean_attributes([["Word1", "Word2", "Word3", "Word4"], ["Word1", "Word5", "Word3", "Word4"], ["Word1", "Word2", "Word3", "Word7"]])
=> [["Word2", "Word4"], ["Word5", "Word4"], ["Word2", "Word7"]]
有沒有更好的辦法?
謝謝!
uj5u.com熱心網友回復:
這是使用 Array#transpose 和 Array#select 的解決方案
[["Word1", "Word2", "Word3", "Word4"], ["Word1", "Word5", "Word3", "Word4"], ["Word1", "Word2", "Word3", "Word7"]]
.transpose
.select {|i| i.uniq.size > 1}
.transpose
第一步是轉置輸入以獲得以下內容:
[["Word1", "Word1", "Word1"], ["Word2", "Word5", "Word2"], ["Word3", "Word3", "Word3"], ["Word4", "Word4", "Word7"]]
那么您只想保留不完全相同的元素。
select { |i| i.uniq.size > 1 }
將只選擇那些不完全相同的元素,給你:
[["Word2", "Word5", "Word2"], ["Word4", "Word4", "Word7"]]
最后你把它轉換成你想要的結果。
transpose
[["Word2", "Word4"], ["Word5", "Word4"], ["Word2", "Word7"]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/389762.html
上一篇:在Ruby中尋找特定概念的名稱
