Wie schreibe ich das in Ruby / Python? Oder können Sie meinen LINQ in Ruby / Python übersetzen?

8

Gestern fragte ich diese Frage und bekam nie wirklich eine Antwort, mit der ich wirklich glücklich war. Ich würde wirklich gerne wissen, wie man eine Liste von N eindeutigen Zufallszahlen unter Verwendung einer funktionalen Sprache wie Ruby generiert, ohne im Stil extrem zwingend zu sein.

Da ich nichts gesehen habe, was ich wirklich mochte, habe ich die Lösung geschrieben, nach der ich in LINQ gesucht habe:

%Vor%

Können Sie meinen LINQ in Ruby übersetzen? Python? Irgendeine andere funktionale Programmiersprache?

Hinweis: Bitte versuchen Sie, nicht zu viele Schleifen und Bedingungen zu verwenden - andernfalls ist die Lösung trivial. Außerdem würde ich lieber eine Lösung sehen, bei der Sie kein Array erzeugen müssen, das viel größer als N ist, so dass Sie dann einfach die Duplikate entfernen und auf N verkleinern können.

Ich weiß, dass ich wählerisch bin, aber ich würde wirklich gerne elegante Lösungen für dieses Problem sehen. Danke!

Bearbeiten:
Warum alle Downvotes?

Ursprünglich hatte mein Codebeispiel das Distinct () nach dem Take () welches, wie viele darauf hinwiesen, mir eine leere Liste hinterlassen konnte. Ich habe die Reihenfolge geändert, in der diese Methoden aufgerufen werden, um zu reflektieren, was ich überhaupt meinte.

Entschuldigung:
Mir wurde gesagt, dass dieser Beitrag ziemlich snobistisch wirkt. Ich wollte nicht implizieren, dass LINQ besser ist als Ruby / Python; oder dass meine Lösung viel besser ist als die von allen anderen. Meine Absicht ist nur zu lernen, wie man dies (mit bestimmten Einschränkungen) in Ruby macht. Es tut mir leid, wenn ich als Idiot hergekommen bin.

    
Esteban Araya 23.09.2008, 16:10
quelle

14 Antworten

5

In Ruby:

%Vor%

Update : Hier ist ein etwas anderer Weg:     a = (0 ... 100) .entries.sort_by {rand} [0 ... 5]

BEARBEITEN:

und in Ruby 1.9 können Sie dies tun:

%Vor%     
Michael Deardeuff 23.09.2008, 16:27
quelle
13
%Vor%

Dies sollte 5 eindeutige Werte im Bereich 0 — 99 ergeben. Das xrange -Objekt generiert Werte wie angefordert, so dass kein Speicher für Werte verwendet wird, die nicht abgetastet werden.

    
Jeremy Banks 23.09.2008 16:18
quelle
3

Hmm ... Wie wäre es mit (Python):

%Vor%     
Will Boyce 23.09.2008 16:24
quelle
2

Ich werde auf die einfachsten Lösungen verzichten, indem ich das "zufällige" Modul benutze, da ich davon ausgehe, dass es nicht das ist, wonach Sie suchen. Hier ist, was ich denke, dass Sie in Python suchen:

%Vor%

Um Ihnen zu zeigen, wie es funktioniert:

%Vor%     
Thomas Wouters 23.09.2008 16:17
quelle
2

Hier ist eine andere Ruby-Lösung:

%Vor%

Ich denke, mit Ihrer LINQ-Anweisung wird der Distinct Dubletten entfernen, nachdem 5 bereits vergeben sind, so dass Sie nicht unbedingt 5 zurückbekommen. Jemand kann mich korrigieren, wenn ich falsch liege.

    
David Mohundro 23.09.2008 16:28
quelle
2

EDIT: Ok, nur zum Spaß, ein kürzerer und schneller (und immer noch mit Iteratoren).

%Vor%

Ja, ich weiß, One-Liners sollten den Perl-Liebhabern überlassen werden, aber ich denke, dieser ist ziemlich mächtig, nicht wahr?

Alte Nachricht hier:

Mein Gott, wie kompliziert ist das alles! Lass uns Python sein:

%Vor%

Genießen

EDIT: Wie Kommentatoren bemerkt haben, ist dies eine exakte Übersetzung des Fragecodes.

Um das Problem zu vermeiden, das wir durch das Entfernen von Duplikaten nach dem Erzeugen der Liste haben, was zu wenig Daten ergibt, können Sie einen anderen Weg wählen:

%Vor%     
e-satis 23.09.2008 16:38
quelle
1

In Ruby 1.9:

%Vor%     
horseyguy 25.09.2010 09:17
quelle
0

Python mit numerischem Python:

%Vor%

Voilà! Sicher könntest du etwas ähnliches in einem funktionalen Programmierstil tun, aber ... warum?

    
Dan Lenski 23.09.2008 16:13
quelle
0
%Vor%     
Joe Skora 23.09.2008 16:31
quelle
0

Nun, zuerst schreibst du LINQ in Python um. Dann ist Ihre Lösung ein One-Liner:)

%Vor%

Wenn Sie alle oben genannten einfachen Methoden in ein Modul namens LINQ.py einsetzen, können Sie Ihre Freunde beeindrucken.

(Disclaimer: Das ist natürlich nicht das Umschreiben von LINQ in Python. Leute haben das Missverständnis, dass LINQ nur ein Haufen trivialer Erweiterungsmethoden und neuer Syntax ist. Der wirklich fortschrittliche Teil von LINQ Es handelt sich jedoch um eine automatische SQL-Generierung. Wenn Sie eine Datenbank abfragen, implementiert die Datenbank Distinct () und nicht die Clientseite.)

    
apenwarr 23.09.2008 16:32
quelle
0

Hier ist eine Transliteration von Ihrer Lösung zu Python.

Zuerst ein Generator, der Zufallszahlen erzeugt. Dies ist nicht sehr Pythonic, aber es ist eine gute Übereinstimmung mit Ihrem Beispielcode.

%Vor%

Hier ist eine Client-Schleife, die einen Satz von fünf verschiedenen Werten sammelt. Dies ist - wiederum - nicht die pythonischste Implementierung.

%Vor%

Es ist nicht klar, warum Sie einen Generator für Zufallszahlen verwenden möchten - das ist eines der wenigen Dinge, die so einfach sind, dass ein Generator es nicht vereinfacht.

Eine eher pythonische Version könnte etwa so aussehen:

%Vor%

Wenn die Anforderungen 5 Werte generieren und unter diesen 5 unterscheiden sollen, dann etwas wie

%Vor%     
S.Lott 23.09.2008 16:42
quelle
0

Vielleicht wird dies Ihren Bedürfnissen entsprechen und ein bisschen mehr linqish aussehen:

%Vor%     
user19087 23.09.2008 16:57
quelle
0

Hier ist eine weitere Python-Version, die besser der Struktur Ihres C # -Codes entspricht. Es gibt keine eingebaute Funktion, um eindeutige Ergebnisse zu erzielen. Deshalb habe ich eine Funktion hinzugefügt.

%Vor%     
Brian 23.09.2008 19:33
quelle
-1

Ich kann deine LINQ nicht wirklich lesen, aber ich denke, du versuchst, 5 Zufallszahlen von bis zu 100 zu erhalten und dann Duplikate zu entfernen.

Hier ist eine Lösung dafür:

%Vor%

Aber vielleicht suchen Sie tatsächlich nach 5 verschiedenen Zufallszahlen zwischen 0 und 100. In diesem Fall:

%Vor%

Nun, dies könnte Ihren Sinn für "nicht zu viele Loops" verletzen, aber vermutlich verstecken Take und Distinct nur die Schleife von Ihnen. Es wäre einfach genug, einfach Methoden zu Enumerable hinzuzufügen, um die while-Schleife auszublenden.

    
hjdivad 23.09.2008 16:23
quelle