En utilisant Ruby pour trouver des lignes communes dans les fichiers X
Question
En ce moment j'ai 3 fichiers, mais je voudrais faire cela d'une manière que je peux ajouter plus tard. Chaque fichier est une liste d'ID, comme celui-ci.
174535945 174538045 160515924 81712260 25241494
Je voudrais que la sortie soit les éléments qui apparaissent dans la liste 1 et la liste 2, 2 liste et la liste 3, et ceux qui se produisent dans la liste 1 et la liste 2 et 3 liste.
Est-ce que la façon la plus rubis être créer un hachage avec une clé pour chaque liste, puis obtenir toutes les clés et tous les tests contre hash, ou est-il un beau bijou qui aider?
Merci,
La solution
Utiliser des ensembles:
require 'set'
list_1 = open(filename_1).read.split.to_set
list_2 = open(filename_2).read.split.to_set
list_3 = open(filename_3).read.split.to_set
puts list_1 & list_2
puts list_2 & list_3
puts list_1 & list_2 & list_3
Autres conseils
Je pense que votre suggestion d'utiliser un hachage est le chemin à parcourir:
require 'set'
class Test
def initialize()
@lists = {174=>[1,2,3], 111=>[2,3,4], 160=>[2,4,5]}
end
def common_members(*keys)
lists_as_sets = {}
@lists.each_pair {|key,list| lists_as_sets[key] = list.to_set}
common = lists_as_sets[keys.shift] # Set to key[0] and nil that element of keys
keys.each {|k| common = common & lists_as_sets[k]} # Intersect the remaining keys, if any
common.to_a
end
end
t = Test.new
p t.common_members(174,111) # => [2,3]
p t.common_members(111,160) # => [2,4]
p t.common_members(174,111,160) # =>[2]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow