Ich wollte diese Frage hier stellen. Aber ich habe es kurz vor mir gelöst. Ich wollte diese Python 2.7-Liste ordentlicher drucken können.

not_shuffled_deck = ["%i of %s" % (i, s) for i in range(2,10) for s in ('spades', 'diamonds', 'clubs', 'hearts')]

for i in not_shuffled_deck:
    print i + "|",

So stellte es sich ursprünglich heraus.

Nun, es ist tatsächlich schlimmer als hier. Dies hängt von der Konsolengröße, der Bildschirmgröße, dem Textumbruch usw. ab. In den von mir verwendeten Konsolen oder sogar in einem normalen Texteditor wird es in mehreren Zeilen schwer lesbar angezeigt .

 2 of spades| 2 of diamonds| 2 of clubs| 2 of hearts| 3 of spades| 3 of diamonds| 3 of clubs| 3 of hearts| 4 of spades| 4 of diamonds| 4 of clubs| 4 of hearts| 5 of spades| 5 of diamonds| 5 of clubs| 5 of hearts| 6 of spades| 6 of diamonds| 6 of clubs| 6 of hearts| 7 of spades| 7 of diamonds| 7 of clubs| 7 of hearts| 8 of spades| 8 of diamonds| 8 of clubs| 8 of hearts| 9 of spades| 9 of diamonds| 9 of clubs| 9 of hearts| 

Also wollte ich eine Möglichkeit, einfach die vier 2er in einer Zeile zu drucken, dann die 3er usw. Mit einem Leerzeichen dazwischen.

-2
CRABOLO 9 Dez. 2013 im 22:16

5 Antworten

Beste Antwort

Gruppieren Sie das erste Element in der Zeichenfolge:

from itertools import groupby

for _, group in groupby(not_shuffled_deck, lambda c: c.split()[0]):
    print '| '.join(group)
    print

Demo:

>>> from itertools import groupby
>>> not_shuffled_deck = ["%i of %s" % (i, s) for i in range(2,10) for s in ('spades', 'diamonds', 'clubs', 'hearts')]
>>> for _, group in groupby(not_shuffled_deck, lambda c: c.split()[0]):
...     print '| '.join(group)
...     print
... 
2 of spades| 2 of diamonds| 2 of clubs| 2 of hearts

3 of spades| 3 of diamonds| 3 of clubs| 3 of hearts

4 of spades| 4 of diamonds| 4 of clubs| 4 of hearts

5 of spades| 5 of diamonds| 5 of clubs| 5 of hearts

6 of spades| 6 of diamonds| 6 of clubs| 6 of hearts

7 of spades| 7 of diamonds| 7 of clubs| 7 of hearts

8 of spades| 8 of diamonds| 8 of clubs| 8 of hearts

9 of spades| 9 of diamonds| 9 of clubs| 9 of hearts

Du hast gefragt:

Können Sie mir im Laienbegriff erklären, wie die Formel funktioniert?

Dies alles dreht sich um die Funktion lambda; groupby() übernimmt jeden Wert von not_shuffled_deck und betrachtet nur die Ausgabe dieser Funktion. c.split() teilt die Kartenzeichenfolge in Leerzeichen auf und es wird nur das erste Element zurückgegeben, also '2' oder '3' usw.

groupby erzeugt dann Gruppen, bei denen das erste Zeichen gleich ist. Das erste Element, das zweite Element, das dritte Element und das vierte Element Ihrer Liste haben alle '2' als erstes in ihren Zeichenfolgen. _ wird auf '2' gesetzt (aber ich ignoriere es hier), und die Gruppe ist eine Iteration, die diese 4 Elemente erzeugt. Wir übergeben diesen Wert an '| '.join(), um eine neue Zeichenfolge zum Drucken zu erstellen.

Ich stelle mir iterables immer als Eimerbrigaden vor; Reihen von Menschen, die Eimer mit Wasser aus einem Fluss, einem Brunnen oder einer Pumpe passieren. Egal woher die Eimer kommen, Sie haben keine Ahnung, wie viele noch kommen werden, aber Sie können nur den nächsten Eimer nehmen. groupby ist wie jemand, der neue Mini-Eimer-Brigaden für Sie organisiert und Ihnen nur einige der Eimer gibt, mit denen er umgeht.

Sie bitten also groupby, Eimer danach zu gruppieren, wie viele Fische mit dem Wasser gefangen wurden. Er gibt Ihnen zuerst eine Person, die sagt: Ich gebe Ihnen nur Eimer mit 2 Fischen. Sie fragen immer wieder nach Eimern, und irgendwann sagt diese Person: Nein, aus Eimern habe ich nichts mehr für Sie. Und du gehst zurück zum groupby Schiedsrichter, der hier eine neue Person sagt, und er wird nur Eimer mit 4 Fischen weitergeben. Und dann sprichst du eine Weile nur mit dem 4-Fische-Eimer-Typ.

In meiner Antwort ist not_shuffled_deck der Brunnen (irgendwann geht ihm das Wasser aus), groupby zählt keine Fische, sondern betrachtet nur den ersten Teil der Schnur und {{X2 }} ist die Person, die Ihnen Eimer gibt, die alle den gleichen ersten Teil der Zeichenfolge haben.

Da es sich um eine Eimerbrigade handelt, hat groupby keine Ahnung, was als nächstes kommt. Wenn es also einen Haufen Eimer mit 2 Fischen gibt, gefolgt von einem Haufen mit 3 Fischen, dann wieder einen Haufen mit nur 2 Fischen Sie erhalten 3 verschiedene Personen, die Ihnen 3 verschiedene Gruppen von Eimern geben. Gruppen werden gebildet, wenn sich das Ergebnis von key (das zweite Argument für groupby) von Bucket zu Bucket ändert. Wenn Sie nicht alle Eimer von der group Person nehmen, wirft groupby Eimer weg. Leere sie direkt auf den Boden .

Wenn Sie eine Eimergruppe mit 2 Fischen nehmen, aber zum groupby Schiedsrichter zurückkehren, um nach einer neuen Gruppenperson zu fragen, wirft der Schiedsrichter alle Eimer mit 2 Fischen heraus, bis er einen Eimer mit einem findet unterschiedliche Anzahl von Fischen, bevor Sie eine neue Person zum Sprechen geben. Sie können dann nicht zur Person mit der Gruppe der 2 Fische zurückkehren und nach weiteren Eimern fragen. Diese Eimer wurden jetzt alle auf der Straße geleert.

5
Martijn Pieters 3 Sept. 2014 im 09:27

Und dies ist die Antwort, die ich gefunden habe und die nicht nur für das funktioniert, was ich jetzt brauche, sondern auch für eine Reihe anderer Möglichkeiten, die sich in Zukunft ergeben könnten.

not_shuffled_deck = ["%i of %s" % (i, s) for i in range(2,10) for s in ('spades', 'diamonds', 'clubs', 'hearts')]

i = 0
for eachCard in not_shuffled_deck:
    if i % 4 == 0 and i != 0:
        print "\n"
        print eachCard + "|",
        i += 1
    else:
        print eachCard + "|",
        i += 1

Welches druckt aus

2 of spades| 2 of diamonds| 2 of clubs| 2 of hearts| 

3 of spades| 3 of diamonds| 3 of clubs| 3 of hearts| 

4 of spades| 4 of diamonds| 4 of clubs| 4 of hearts| 

5 of spades| 5 of diamonds| 5 of clubs| 5 of hearts| 

6 of spades| 6 of diamonds| 6 of clubs| 6 of hearts| 

7 of spades| 7 of diamonds| 7 of clubs| 7 of hearts| 

8 of spades| 8 of diamonds| 8 of clubs| 8 of hearts| 

9 of spades| 9 of diamonds| 9 of clubs| 9 of hearts|
1
Martijn Pieters 9 Dez. 2013 im 18:22

Mach es also nicht so , denn wie @MartijnPieters betonte, verschwendest du Zyklen und Speicher, um eine Liste von None zu erstellen, aber hier war meine Antwort mit einem Listenverständnis ( weil ich sie liebe!)

my_deck_with_returns = []

[my_deck_with_returns.append(' {} of {} |'.format(i, s))
 for i in range(2,10) for s in ('spades', 'diamonds', 'clubs', 'hearts')
 if s != 'spades' or not my_deck_with_returns.append('\n')]

print ''.join(my_deck_with_returns)

Scrollen Sie nach unten, um einen Vorschlag von @MartijnPieters zu erhalten, der die Attraktivität bewahrt und nur die erforderlichen Ressourcen verwendet.

0
Roberto 9 Dez. 2013 im 18:37

Ich habe eine andere Lösung mit Join und Split:

not_shuffled_deck = ["%i of %s" % (i, s) for i in range(2,10) for s in ('spades', 'diamonds', 'clubs', 'hearts')]
print(" " +"hearts\n".join("| ".join(not_shuffled_deck).split("hearts|")))
1
Alvaro Fuentes 9 Dez. 2013 im 18:49

Mit itertools.islice können Sie die Liste gleichmäßig in 4er-Gruppen aufteilen.

>>> from itertools import islice
>>> from math import ceil
>>> it = iter(not_shuffled_deck)
for _ in xrange(int(math.ceil(len(not_shuffled_deck)/4.))):
    data = islice(it, 4)
    print '| '.join(data)
...     
2 of spades| 2 of diamonds| 2 of clubs| 2 of hearts
3 of spades| 3 of diamonds| 3 of clubs| 3 of hearts
4 of spades| 4 of diamonds| 4 of clubs| 4 of hearts
5 of spades| 5 of diamonds| 5 of clubs| 5 of hearts
6 of spades| 6 of diamonds| 6 of clubs| 6 of hearts
7 of spades| 7 of diamonds| 7 of clubs| 7 of hearts
8 of spades| 8 of diamonds| 8 of clubs| 8 of hearts
9 of spades| 9 of diamonds| 9 of clubs| 9 of hearts

Oder mit List Slicing (slice notation):

>>> n = int(math.ceil(len(not_shuffled_deck)/4.))
>>> for i in xrange(0, n*4, 4): 
    print '| '.join(not_shuffled_deck[i:i+4])
...     
2 of spades| 2 of diamonds| 2 of clubs| 2 of hearts
3 of spades| 3 of diamonds| 3 of clubs| 3 of hearts
4 of spades| 4 of diamonds| 4 of clubs| 4 of hearts
5 of spades| 5 of diamonds| 5 of clubs| 5 of hearts
6 of spades| 6 of diamonds| 6 of clubs| 6 of hearts
7 of spades| 7 of diamonds| 7 of clubs| 7 of hearts
8 of spades| 8 of diamonds| 8 of clubs| 8 of hearts
9 of spades| 9 of diamonds| 9 of clubs| 9 of hearts
2
Ashwini Chaudhary 9 Dez. 2013 im 18:29