2016-03-09 12 views
15

Ich muss ein 3 x 3-Array für ein Spiel namens TicTackToe.py drucken. Ich weiß, dass wir Sachen aus einer Liste in einer horizontalen oder vertikalen Art und Weise durch die Verwendungwie 3x3-Array in Python drucken?

listA=['a','b','c','d','e','f','g','h','i','j'] 
# VERTICAL PRINTING 
for item in listA: 
     print item 

Ausgabe drucken:

a 
b 
c 

oder

# HORIZONTAL PRINTING 
for item in listA: 
     print item, 

Ausgang:

a b c d e f g h i j 

Wie kann ich eine Mischung aus beiden ausdrucken, z eine Box 3x3 Druck wie

a b c 
d e f 
g h i 

Antwort

23

Sie können die Elemente enumerate und ein Newline drucken nur jedes dritte Element:

for index, item in enumerate('abcdefghij', start=1): 
    print item, 
    if not index % 3: 
     print 

Ausgang:

a b c 
d e f 
g h i 
j 

enumerate beginnt bei Null standardmäßig zu zählen, so dass ich start=1.

Als @arekolek Kommentare, wenn Sie mit Python sind 3 oder haben die Druckfunktion aus der Zukunft für Python 2 importiert, können Sie die Zeile angeben alle in einem Rutsch, anstelle der beiden oben genannten Schritte endet:

for index, item in enumerate('abcdefghij', start=1): 
    print(item, end=' ' if index % 3 else '\n') 
+2

Erstaunlich, dass es bestimmte "Rezepte" (wie Padraic zeigt), aber ich denke, Ihr Weg ist viel besser - weil ** Ihr Code ist einfach und seine Wirkung offensichtlich ** sogar ein Python-Neuling (dh ohne Kenntnis von (seltenen?) Importen). – KlaymenDK

+1

Dies könnte auch neu geschrieben werden, indem die Druckfunktion als 'für i, v in enumerate ('abcdefghij', 1) verwendet wird: print (v, end = '' wenn i% 3 else '\ n') '. – arekolek

+0

Sie könnten auch 'start = 1 'vermeiden und' '\ n' verwenden, wenn i% 3 == 2 else '' oder '' 'wenn i% 3 <2 else' \ n''. – Bakuriu

8

Ein einfacher Ansatz, um den Modulo-Operator zu verwenden wäre:

listA=['a','b','c','d','e','f','g','h','i','j'] 

count = 0 

for item in listA: 
    if not count % 3: 
     print 
    print item, 
    count += 1 

Wie von Peter Wood wies darauf hin, können Sie den Enumerator-Operator verwenden, das zu vermeiden Zählvariable:

listA=['a','b','c','d','e','f','g','h','i','j'] 

listB = enumerate(listA) 
for item in listB: 
    if not item[0] % 3: 
     print 
    print item[1], 
+2

Warum nicht verwenden [** 'enumerate' **] (https://docs.python.org/2/library/ functions.html # enumerate) um das Zählen für Sie zu tun? –

+1

Das ist total funktionell, aber die peinlichste Verwendung von 'enumerate', die ich gesehen habe. Außerdem ist es die Enumerate-Funktion, nicht der Enumerator-Operator. Ihre Version reimt sich jedoch besser. –

11

können Sie verwenden, um die Logik von der grouper recipe:

listA=['a','b','c','d','e','f','g','h','i','j'] 

print("\n".join(map(" ".join, zip(*[iter(listA)] * 3)))) 
a b c 
d e f 
g h i 

Wenn Sie nicht wollen, Elemente izip_longest mit einem leeren String als fillvalue verwenden verlieren:

listA=['a','b','c','d','e','f','g','h','i','j'] 
from itertools import izip_longest 

print("\n".join(map(" ".join, izip_longest(*[iter(listA)] * 3,fillvalue="")))) 

Welche dadurch unterscheidet, dass es den j hält:

a b c 
d e f 
g h i 
j 

Sie können Setzen Sie die Logik in eine Funktion und rufen Sie sie auf, wenn Sie drucken möchten. Geben Sie die gewünschten Werte ein.

from itertools import izip_longest 

def print_matrix(m,n, fill): 
    print("\n".join(map(" ".join, izip_longest(*[iter(m)] * n, fillvalue=fill)))) 

Oder ohne itertools nur Brocken und kommen, können Sie auch eine sep arg nehmen als Trennzeichen zu verwenden:

def print_matrix(m,n, sep): 
    print("\n".join(map("{}".format(sep).join, (m[i:i+n] for i in range(0, len(m), n))))) 

Sie müssen nur für jede Zeile die Liste und die Größe zu übergeben:

In [13]: print_matrix(listA, 3, " ") 
a b c 
d e f 
g h i 
j 

In [14]: print_matrix(listA, 3, ",") 
a,b,c 
d,e,f 
g,h,i 
j 

In [15]: print_matrix(listA, 4, ",") 
a,b,c,d 
e,f,g,h 
i,j 

In [16]: print_matrix(listA, 4, ";") 
a;b;c;d 
e;f;g;h 
i;j 
4

Eine Alternative zu den zwei Antworten, die hier gegeben werden, ist, etwas zu verwenden, das die Formatierung für Sie tut, wie numpy. Dies ist eine externe Abhängigkeit Sie in der Regel nicht wollen könnten, aber wenn Sie bereits Dinge in Grids/Matrizen speichern, kann es eine logische Wahl:

from numpy import array 
str(array(listA).reshape((3,3))) 

es in einem Array Stoßen, umformen es in Ihrem Liebling (kompatibel) Form, und machen Sie es zu einer Zeichenfolge. Könnte nicht intuitiver sein!

+1

"Konnte nicht intuitiver sein!" "Ja wirklich?" –

+1

@MadPhysicist syntaktisch, glaube ich nicht so (vielleicht bin ich ein bisschen hyperbolisch). Nehmen Sie eine flache Anordnung und gestalten Sie sie um: das macht Sinn für mich. Wenn ich das sehe, wüsste ich sofort, was es tut: Wenn ich Padraics Antwort mit join-> map-> join-> zip-> sehen würde, würde es eine Sekunde dauern, um herauszufinden, was wir tun. Diese Antwort ist genial, versteh mich nicht falsch, aber ich denke, das ist auch eine gute Option :) –

+0

@MadPhysicist Wenn Sie "intuitiv in Bezug auf das, was jemand neues zu Python vertraut sein würde" gehen, dann scheint es wie die mit Modulus sind etwa so gut wie Sie bekommen –

4

Sie das Format Methode des String-Objekt verwenden:

for i in range(3): 
    print "{} {} {}".format(*listA[3*i:3*i+3]) 

auch anstelle des Index bei jeder Iteration um 3 multiplizieren, können Sie die Schritte aus drei Elementen durch die Liste nehmen nur:

for i in range(0, len(listA), 3): 
    print "{} {} {}".format(*listA[i:i+3]) 
+1

In Python 3: 'für i im Bereich (0, len (listA), 3): print (* listA [i: i + 3])' – arekolek

+0

@arekolek, das würde auch in py2.7 gut funktionieren. Es funktioniert genauso, egal ob du alle drei Schritte machst oder mit drei multiplizierst. Ich habe letzteres gewählt, aber Ihre Syntax sieht sauberer aus. –

+0

Ich dachte tatsächlich über die Druckfunktion nach, als ich den Haftungsausschluss einfügte. Aber natürlich könntest du [aus der Zukunft importieren] (https://docs.python.org/2/library/__future__.html). Übrigens können Sie es gerne in Ihre Antwort aufnehmen. – arekolek

0
print ''.join(' '*(n%3!=0)+l+'\n'*(n%3==2) for n,l in enumerate(listA)) 

a b c 
d e f 
g h i 
j 

Python ist genial.

+4

Obwohl Python genial ist, ist diese Frage kein verschleiertes Code Turnier –

+0

Feine Linie zwischen "verschleiert" und "wunderbar prägnant", würdest du nicht sagen? –

+0

Was ist die Ausgabe? –

1

Eine Methode, die nicht erwähnt wurde: Holen Sie sich die Scheibe der Liste mathematisch und print von der Scheibe der Liste.

In Python 2.x:

listA=['a','b','c','d','e','f','g','h','i','j'] 
val = (len(listA) + 2) // 3 
for i in range(val): 
    print(' '.join(listA[i*3:(i+1)*3])) 

In Python 3.x:

listA=['a','b','c','d','e','f','g','h','i','j'] 
val = (len(listA) + 2) // 3 
for i in range(val): 
    print(*listA[i*3:(i+1)*3], sep=" ")