2010-03-14 24 views
13

Le module itertools de Python fournit un tas de goodies en ce qui concerne le traitement d'un itérateur/itérateur à l'aide de générateurs. Par exemple,Quels sont les équivalents Ruby de Python itertools, esp. combinaisons/permutations/groupby?

permutations(range(3)) --> 012 021 102 120 201 210 

combinations('ABCD', 2) --> AB AC AD BC BD CD 

[list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D 

Quels sont les équivalents dans Ruby? Par équivalent, je veux dire rapide et efficace en mémoire (le module itertools de Python est écrit en C).

Répondre

18

Array#permutation, Array#combination et Enumerable#group_by sont définis dans ruby ​​depuis 1.8.7. Si vous utilisez la version 1.8.6, vous pouvez obtenir des méthodes équivalentes à partir des facettes ou d'active_support ou backports.

Exemple d'utilisation:

[0,1,2].permutation.to_a 
#=> [[0, 1, 2], [0, 2, 1], [1, 0, 2], [1, 2, 0], [2, 0, 1], [2, 1, 0]] 

[0,1,2,3].combination(2).to_a 
#=> [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]] 

[0,0,0,1,1,2].group_by {|x| x}.map {|k,v| v} 
#=> [[0, 0, 0], [1, 1], [2]] 

[0,1,2,3].group_by {|x| x%2} 
#=> {0=>[0, 2], 1=>[1, 3]} 
+4

Notez que group_by fonctionne différemment à itertools.groupby. [0,0,1,1,0,0] .group_by donne 2 groupes alors que itertools.groupby donnerait 3 groupes –

+1

qu'en est-il de itertools.chain? –