2010-03-14 8 views
13

Python itertools Modul bietet eine Menge Leckereien in Bezug auf die Verarbeitung eines iterierbaren/Iterator durch den Einsatz von Generatoren. Zum BeispielWas ist das Ruby-Äquivalent von Python itertools, esp. Kombinationen/Permutationen/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 

Was sind die Entsprechungen in Ruby?

Mit Äquivalent, ich meine schnell und Speicher effizient (Python Itertools-Modul ist in C geschrieben).

Antwort

18

Array#permutation, Array#combination und Enumerable#group_by sind in Ruby seit 1.8.7 definiert. Wenn Sie 1.8.6 verwenden, können Sie äquivalente Methoden von Facetten oder Active_Support oder backports erhalten.

Verwendungsbeispiel:

[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

Beachten Sie, dass Arbeiten ganz anders itertools.groupby GROUP_BY. [0,0,1,1,0,0] .group_by gibt 2 Gruppen, während itertools.groupby 3 Gruppen geben würde –

+1

Wie wäre es mit itertools.chain? –

Verwandte Themen