Liste int -> strin

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
JustHechi
User
Beiträge: 12
Registriert: Samstag 26. Oktober 2013, 20:14

Hallo ich hab ein problem ich will eine Art kartenspiel programmieren und will dazu die symbole "pik, herz, etc." benutzen das hab ich mit dem unicode gemacht und dann jeweils ein variablen zugeordent (zb. P = pik)

Mein Problem jetzt ist es das ich eine liste anfertigen will mir allen karten die es gibt (32) und wenn ich aufrufe l[0] soll zb. 3pik herausgegeben werden in der shell ich kann aber nicht den int mit einem string verbinden. Also ist meine frage wie hänge ich in einer liste in einem element ein string direkt an ein integer oder muss ich das umgehen??

Danke für alle antworten

Grüße Hechi~~!
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

JustHechi hat geschrieben:Also ist meine frage wie hänge ich in einer liste in einem element ein string direkt an ein integer oder muss ich das umgehen?
Es wäre schön, wenn du konkreten Code gezeigt und/oder eine echte Fehlermeldung angegeben hättest.

Hier mal ein Denkanstoß.

Code: Alles auswählen

>>> i = 42
>>> s = 'answer'
>>> print(s + i)
Traceback (most recent call last):
  File "<pyshell#29>", line 1, in <module>
    print(s + i)
TypeError: Can't convert 'int' object to str implicitly
>>> print(s + str(i))
answer42
>>> print('The {0} is {1}.'.format(s, i))
The answer is 42
Benutzeravatar
JustHechi
User
Beiträge: 12
Registriert: Samstag 26. Oktober 2013, 20:14

sorry hatte ich eigentlich gemacht hab wohl nicht richtig eingefügt
also hier mein code Abschnitt arbeite das erste mal mit Listen....

Code: Alles auswählen

>>> P
'♠'
>>> H
'♥'
>>> K
'♣'
>>> R
'♦'
>>> Stapel = [3K, 3P, 3R, 3H]
SyntaxError: invalid syntax
>>> Stapel = [3+K, 3+P]
Traceback (most recent call last):
  File "<pyshell#102>", line 1, in <module>
    Stapel = [3+K, 3+P]
TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>> 

also wie schon gesagt ich will das das karten symbo direkt hinter der zahl ist wenn ich den index der liste aufrufe muss ich dann die zahl zu string umwandeln?

nochmal danke für alle antworten~~
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

JustHechi hat geschrieben:

Code: Alles auswählen

>>> P
'♠'
>>> H
'♥'
>>> K
'♣'
>>> R
'♦'
>>> Stapel = [3K, 3P, 3R, 3H]
SyntaxError: invalid syntax
3K ist kein gültiger Wert. Python verbindet nicht auf magische Art und Weise irgendwelche Dinge miteinander. Du willst im Endeffekt einen String haben der wie folgt aussieht: '3♣'. Also musst du die beiden gewünschten Teile miteinander verbinden. Das ist dann beispielsweise '3' + K.

Ich halte es übrigens nicht für eine gute Idee, die Typen an die einzelnen Namen P, H, K und R zu binden. Du solltest eine Liste oder eine andere geeignete Datenstruktur in Erwägung ziehen Damit würdest du dir auch die Erzeugung der Karten einfacher machen. Ich mag mir gar nicht vorstellen, wie das aktuell aussieht.

Code: Alles auswählen

>>> import itertools
>>> suits = '♣♠♥♦'
>>> values = '23456789BDKA'
>>> print(list(itertools.product(values, suits)))
[('2', '♣'), ('2', '♠'), ('2', '♥'), ('2', '♦'), ('3', '♣'), ('3', '♠'), ('3', '♥'), ('3', '♦'), ('4', '♣'), ('4', '♠'), ('4', '♥'), ('4', '♦'), ('5', '♣'), ('5', '♠'), ('5', '♥'), ('5', '♦'), ('6', '♣'), ('6', '♠'), ('6', '♥'), ('6', '♦'), ('7', '♣'), ('7', '♠'), ('7', '♥'), ('7', '♦'), ('8', '♣'), ('8', '♠'), ('8', '♥'), ('8', '♦'), ('9', '♣'), ('9', '♠'), ('9', '♥'), ('9', '♦'), ('B', '♣'), ('B', '♠'), ('B', '♥'), ('B', '♦'), ('D', '♣'), ('D', '♠'), ('D', '♥'), ('D', '♦'), ('K', '♣'), ('K', '♠'), ('K', '♥'), ('K', '♦'), ('A', '♣'), ('A', '♠'), ('A', '♥'), ('A', '♦')]
>>> print([''.join(card) for card in itertools.product(values, suits)])
['2♣', '2♠', '2♥', '2♦', '3♣', '3♠', '3♥', '3♦', '4♣', '4♠', '4♥', '4♦', '5♣', '5♠', '5♥', '5♦', '6♣', '6♠', '6♥', '6♦', '7♣', '7♠', '7♥', '7♦', '8♣', '8♠', '8♥', '8♦', '9♣', '9♠', '9♥', '9♦', 'B♣', 'B♠', 'B♥', 'B♦', 'D♣', 'D♠', 'D♥', 'D♦', 'K♣', 'K♠', 'K♥', 'K♦', 'A♣', 'A♠', 'A♥', 'A♦']
Benutzeravatar
JustHechi
User
Beiträge: 12
Registriert: Samstag 26. Oktober 2013, 20:14

mein problem ist es das ich eine liste will von 32-karten 2-9 mit jeweils den 4 symbolen
aber ich will die am besten als Liste damit ich den befehl benutzen kann s.count um zu bestimmen wie viele 3-er karten ein spieler hat z.b. ohne auf die symbole zu achten und ich weiß nicht wie ich das zusammen in eine liste und als eine funktion schreiben kann

ich hab halt das wissen was ich machen will aber ich kenn mich noch zu wenig aus ich weiß ich sollte es selber suchen und dann bin ich schlauer aber ich mach das schon seit 2-tagen und wenns soweiter geht dauerts auch noch doppelt solang und 5x soviel code....

Code: Alles auswählen

s = [(2, '♣'), (2, '♠'), (2, '♥'), (2, '♦'), ('3', '♣'), ('3', '♠'), ('3', '♥'), ('3', '♦'), ('4', '♣'), ('4', '♠'), ('4', '♥'), ('4', '♦'), ('5', '♣'), ('5', '♠'), ('5', '♥'), ('5', '♦'), ('6', '♣'), ('6', '♠'), ('6', '♥'), ('6', '♦'), ('7', '♣'), ('7', '♠'), ('7', '♥'), ('7', '♦'), ('8', '♣'), ('8', '♠'), ('8', '♥'), ('8', '♦'), ('9', '♣'), ('9', '♠'), ('9', '♥'), ('9', '♦')]
>>> s
[(2, '♣'), (2, '♠'), (2, '♥'), (2, '♦'), ('3', '♣'), ('3', '♠'), ('3', '♥'), ('3', '♦'), ('4', '♣'), ('4', '♠'), ('4', '♥'), ('4', '♦'), ('5', '♣'), ('5', '♠'), ('5', '♥'), ('5', '♦'), ('6', '♣'), ('6', '♠'), ('6', '♥'), ('6', '♦'), ('7', '♣'), ('7', '♠'), ('7', '♥'), ('7', '♦'), ('8', '♣'), ('8', '♠'), ('8', '♥'), ('8', '♦'), ('9', '♣'), ('9', '♠'), ('9', '♥'), ('9', '♦')]
>>> s.count (2)
0
hier ist das beispiel das von oben und ich wills in etwa auch so bloß das ich eingeben kann s.count (2) und dann halt 4 rauskommt

ich hoffe wirklich wirklich jemand kann mir vllt ein kleinen schubser in die richtige richtung geben


danke für jede antwort!

Grüße Hechi~~!
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mich hat noch eine PM mit einer Frage erreicht und ich möchte sie hier beantworten. (Edit: Ah, die Frage ist jetzt auch hier)

Es geht darum, wie ich in einer Liste von Karten die Karten mit einem bestimmten Wert zählen kann.

Grundsätzlich bietet es sich dabei an, Kartenwert und Symbol getrennt voneinander zu halten. Das macht die Verarbeitung auf Dauer leichter und für die Ausgabe kann man die Daten problemlos zusammenfügen. Das einfachste ist es erst einmal die Werte in einem Tupel zusammenzufassen: (3, '♣').

Code: Alles auswählen

# nicht so gut
cards = ['♣', '2♠', '2♥', '2♦', '3♣', '3♠', '3♥', '4♣', '4♠', '6♣']
#besser
cards = [(2, '♣'), (2, '♠'), (2, '♥'), (2, '♦'), (3, '♣'), (3, '♠'), (3, '♥'), (4, '♣'), (4, '♠'), (6, '♣')]
Jetzt wollen wir die Karten mit einem bestimmten Wert zählen. Dafür müssen wir uns jede Karte anschauen, also brauchen wir schon mal eine Schleife über alle Karten. In der Schleife schauen wir uns dann gezielt das erste Element des Tupels (Index 0!) an um den Wert zu bekommen. An der zweiten Stelle (Index 1!) steht das Symbol. Passt also der Wert der aktuellen Karte zum gesuchten Wert, dann erhöhen wir einen Zähler um 1.

Im Code könnte das dann so aussehen:

Code: Alles auswählen

def count_cards_by_value_1(cards, value_to_search):
    counter = 0
    for card in cards:
        if card[0] == value_to_search:
            counter += 1
    return counter
Man kann das Tupel auch direkt in seine Bestandteile zerlegen:

Code: Alles auswählen

def count_cards_by_value_2(cards, value_to_search):
    counter = 0
    for card_value, card_suit in cards:
        if card_value == value_to_search:
            counter += 1
    return counter
Ich würde es vermutlich wie folgt lösen:

Code: Alles auswählen

def count_cards_by_value_3(cards, value_to_search):
    return len(list(filter(lambda card: card[0] == value_to_search, cards)))
Speichere dir diesen Code einfach irgendwo ab und versuche ihn im Lauf der Zeit zu verstehen. Noch bist du ja bei den Grundlagen.

Der Aufruf sieht dann einfach so aus:

Code: Alles auswählen

print(count_cards_by_value_1(cards, 4))
BlackJack

Das bekommt man mit einem Generatorausdruck IMHO unkomplizierter hin:

Code: Alles auswählen

def count_cards_by_value_4(cards, value_to_search):
    return sum(1 for value, suite in cards if value == value_to_search)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:Das bekommt man mit einem Generatorausdruck IMHO unkomplizierter hin:

Code: Alles auswählen

def count_cards_by_value_4(cards, value_to_search):
    return sum(1 for value, suite in cards if value == value_to_search)
Ja, bekommt man. Das ist definitiv schöner.
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Oder gleich die Wahrheit zum zählen benutzen:

Code: Alles auswählen

def count_cards_by_value_5(cards, value_to_search):
    return sum(value == value_to_search for value, suite in cards)
Benutzeravatar
JustHechi
User
Beiträge: 12
Registriert: Samstag 26. Oktober 2013, 20:14

ahhh perfekt hab zwar ein tag gebraucht bis ich die funktion wirklich verstanden hab aber jetzt weiß ich wie du das gemacht hast.... jedenfalls value_1
danke an euch alle ihr habt mir sehr weiter geholfen!
Antworten