2010-03-14 11 views
13

Il modulo Python itertools fornisce un sacco di chicche rispetto all'elaborazione di un iteratore iteratore mediante l'uso di generatori. Ad esempio,Quali sono gli equivalenti in Ruby di Python itertools, esp. combinazioni/permutazioni/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 

Quali sono l'equivalente in Ruby?

Equivalente, intendo veloce ed efficiente in memoria (il modulo itertools di Python è scritto in C).

risposta

18

Array#permutation, Array#combination e Enumerable#group_by sono definiti in rubino dal 1.8.7. Se si utilizza 1.8.6 è possibile ottenere metodi equivalenti da facet o active_support o backports.

Esempio di utilizzo:

[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

Nota che group_by opere in modo diverso a itertools.groupby. [0,0,1,1,0,0] .group_by dà 2 gruppi mentre itertools.groupby darebbe 3 gruppi –

+1

come su itertools.chain? –

Problemi correlati