Nummerierung nach Muster A1 A2 B1 usw. erzeugen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
martinjo
User
Beiträge: 189
Registriert: Dienstag 14. Juni 2011, 20:03

Hallo

Ich weiß nicht warum ich mich bei so kleinen Sachen immer so lange aufhalte. Was würdet ihr hier für eine Lösung wählen wenn man ein Muster Wie im Titel beschrieben anlegen will?

rows = 4
columns = 6
row_letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

Für jede Reihe einen Buchstaben auswählen und diesen nach der Anzahl an Spalten herunterzählen. Ausgabe einfach über print.

A1 B1 C1 D1
A2 B2 C2 D2
A3 ... ... ...
... ... ... ...
Benutzeravatar
martinjo
User
Beiträge: 189
Registriert: Dienstag 14. Juni 2011, 20:03

Meine bescheidene Lösung:

Code: Alles auswählen

for x in range(location_rows):
    count = 1
    for y in range(location_columns):
        result = row_letters[x] + str(count)
        count = count+1
        print result
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

In [5]: def board(columns, rows):
    return ["{}{}".format(c, n) for c in string.ascii_uppercase[:columns] for n in xrange(1, rows+1)]
   ...: 

In [6]: board(3, 4)                                                                    
Out[6]: ['A1', 'A2', 'A3', 'A4', 'B1', 'B2', 'B3', 'B4', 'C1', 'C2', 'C3', 'C4']

In [7]: def board(columns, rows):
    return ["{}{}".format(c, n) for n in xrange(1, rows+1) for c in string.ascii_uppercase[:columns]]
   ...: 

In [8]: board(3, 4)                                                                    
Out[8]: ['A1', 'B1', 'C1', 'A2', 'B2', 'C2', 'A3', 'B3', 'C3', 'A4', 'B4', 'C4']

In [9]: def board(columns, rows):
    return [["{}{}".format(c, n) for n in xrange(1, rows+1)] for c in string.ascii_uppercase[:columns]]
   ...: 

In [10]: board(3, 4)                                                                     
Out[10]: [['A1', 'A2', 'A3', 'A4'], ['B1', 'B2', 'B3', 'B4'], ['C1', 'C2', 'C3', 'C4']]

In [11]: def board(columns, rows):                                                     
    return [["{}{}".format(c, n) for c in string.ascii_uppercase[:columns]] for n in xrange(1, rows+1)]
   ....: 

In [12]: board(3, 4)                                                                     
Out[12]: 
[['A1', 'B1', 'C1'],
 ['A2', 'B2', 'C2'],
 ['A3', 'B3', 'C3'],
 ['A4', 'B4', 'C4']]
Such dir was aus, wobei die letzte Variante deiner Beschreibung am naehesten kommt.

Wenn du tatsaechlich nur direkt ausgeben willst ist vielleicht das besser:

Code: Alles auswählen

In [18]: def board(columns, rows):
    for n in xrange(1, rows+1):
        for c in string.ascii_uppercase[:columns]:
            print "{}{}".format(c, n),
        print

In [19]: board(3, 4)
A1 B1 C1
A2 B2 C2
A3 B3 C3
A4 B4 C4
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Cofi hat schon ein paar Beispiele, deshalb nur mal ein paar Tipps zu deinem Code.

Wenn du result = row_letters[x] machst dann willst du nicht for x in range verwenden sondern sowas machen:

Code: Alles auswählen

row_letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for e in row_letters:
    print e
Wenn du vor eine Schleife ein count = 0 schreibst und in der Schleife dann count = count + 1 machst ( schöner count += 1 ) dann willst du eigentlich enumerate verwenden.

Code: Alles auswählen

>>> text = 'Hallo'
>>> for i, e in enumerate(text):
...     print i, e
...
0 H
1 a
2 l
3 l
4 o
mfG Lars
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

Sr4l hat geschrieben:Wenn du vor eine Schleife ein count = 0 schreibst und in der Schleife dann count = count + 1 machst ( schöner count += 1 ) dann willst du eigentlich enumerate verwenden.

Code: Alles auswählen

>>> text = 'Hallo'
>>> for i, e in enumerate(text):
...     print i, e
...
0 H
1 a
2 l
3 l
4 o
Hey, bin Anfänger mit Python. Habe ein Frage: Wofür ist das e, in for i,e ...?
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
Benutzeravatar
pillmuncher
User
Beiträge: 1532
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Code: Alles auswählen

>>> import itertools, string
>>> map(''.join, itertools.product(string.uppercase[:4], map(str, xrange(1, 5))))
['A1', 'A2', 'A3', 'A4', 'B1', 'B2', 'B3', 'B4', 'C1', 'C2', 'C3', 'C4', 'D1', 'D2', 'D3', 'D4']
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
martinjo
User
Beiträge: 189
Registriert: Dienstag 14. Juni 2011, 20:03

Danke für die vielen Lösungsansätze. string.ascii_uppercase wollte bei mir nicht weil ich string zu importieren vergessen hatte^^

2 Fragen hätte ich noch, warum muss man hier xrange statt range verwenden und wie könnte ich die beiden Funktionen "create_parent_location" und "create_parent_location" verbessern um Teile nicht doppelt schreiben zu müssen?

Hier mein komplettes Skript:

Erläuterung:
Es wird ein Hauptlager angelegt (R01) in dem Warenhaus mit dem Code "STO"
Dann werden die Unterlager nach dem Muster R01_A1 usw. im Lager R01 angelegt.

Code: Alles auswählen

warehouse_code = 'STO'
location_name = 'R01'
location_rows = 4
location_columns = 6


def create_parent_location():
    location = Location()
    location.name = location_name
    location.type = 'storage'
    parent = location.find([('code', '=', warehouse_code)])
    location.parent = parent[0]
    location.save()


def create_locations(result):
    location = Location()
    location.name = result
    location.type = 'storage'
    parent = location.find([('name', '=', location_name)])
    location.parent = parent[0]
    location.save()


def create_units():
    for n in xrange(1, location_rows+1):
        for c in string.ascii_uppercase[:location_columns]:
            sto_unit_name = "{}{}{}{}".format(location_name,'_',c, n)
            create_locations(sto_unit_name)

create_parent_location()
create_units()
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

martinjo hat geschrieben:warum muss man hier xrange statt range verwenden
Muss man nicht, man erstellt nur keine Liste, die man nicht braucht.
martinjo hat geschrieben:und wie könnte ich die beiden Funktionen "create_parent_location" und "create_parent_location" verbessern um Teile nicht doppelt schreiben zu müssen?
Du willst dich mal ueber Funktionsargumente informieren .. die sehen so aus wie die Teile, die du aus meiner Funktion gestrichen hast.

@StefanLawl: Das du ein Anfaenger bist ist kein Grund fremde Threads zu kapern. Bitte erstelle eigene Threads zu fragen, die mit dem Thema nichts zu tun haben, um anderen mit so einer Frage eine Chance zu geben eine Antwort zu finden.
Teste doch mal was passiert, wenn du `x` statt `i, e` benutzt. Wenn du das getan hast, schau dir den letzten absatz hier an
Benutzeravatar
martinjo
User
Beiträge: 189
Registriert: Dienstag 14. Juni 2011, 20:03

Das Hauptproblem sah ich darin, dass einmal (beim Hauptlager) als Elternlager anhand eines Codes gesucht wird und bei den weiteren Lagern über den Namen. Das habe ich jetzt einfach mit einer if-Schleife gelöst. Damit bin ich erstmal zufrieden. Danke
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

martinjo hat geschrieben:if-Schleife
if-Schleife
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten