ignorieren eines bestimmten Wertes

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
Tombery
User
Beiträge: 29
Registriert: Mittwoch 10. Juli 2019, 19:56

Hallöchen,

ich habe eine Funktion geschrieben die folgendes machen soll. Sie soll mir aus meiner Hand die Elemente heraussuchen die am öftesten vorkommen und dies dann in eine Liste packen und zwar so oft wie sie vorkommen. Sind zwei verschiedene Elemente gleich oft in der Liste, so soll er die Elemente mit dem größeren Wert nehmen.

Ein Beispiel zur Verdeutlichung:
Hand = [1,2,3,3,4,4,4,4,4,13,5,5,5,5,5,13,13,]
der Return sollte sein mCard = [5,5,5,5,5]

Hier der Code der funktionieren sollte:

Code: Alles auswählen

from collections import Counter
def maxmin(Hand):
    i = 0
    mCard = []
    Hand = Counter(Hand)
    x = Counter.most_common(Hand)[0][0]
    while i < Counter.most_common(Hand)[0][1]:
        mCard.append(x)
        i = i + 1
    return mCard
Dies ist vielleicht mal wieder schlecht geschrieben aber zumindest hat es bis jetzt gut funktioniert.
Nun hab ich das Problem, dass er die '13' also immer nur die Zahl 13 ignorieren sollte und zwar solange, bis er absolut keine andere Wahl mehr hat.
Mit ignorieren meine ich, dass er all anderen Zahlen bevorzugt nehmen sollte.
Leider ist es mir nicht möglich die 13 einfach 0 zu nennen.
Benutzeravatar
__blackjack__
User
Beiträge: 14045
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Tut das was es soll?

Code: Alles auswählen

def max_min(hand):
    counts = Counter(hand).most_common()
    counts.sort(key=lambda pair: (pair[1], 0 if pair[0] == 13 else pair[0]))
    value, count = counts[-1]
    return [value] * count
Edit: `most_common()` und dann noch mal sortieren ist natürlich Unsinn wenn man nur ein Maximum braucht:

Code: Alles auswählen

def max_min(hand):
    value, count = max(
        Counter(hand).items(),
        key=lambda pair: (pair[1], 0 if pair[0] == 13 else pair[0])
    )
    return [value] * count
Zuletzt geändert von __blackjack__ am Montag 29. Juli 2019, 15:54, insgesamt 1-mal geändert.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt die Bedingungen einfach in eine max-key-Funktion packen.

Um es nicht zu einfach zu machen, hier mal ein Beispiel, dass wenn es geht, die Anzahl der Karten gerade sein soll, aber der größte Wert mit den meisten Karten zurückgegeben werden soll:

Code: Alles auswählen

def extract_most_common_cards(hand):
    most_common = Counter(hand).most_common()
    value, count = max(most_common, key=lambda pair: (pair[1] % 2 == 0, pair[1], pair[0]))
    return [value] * count

print(extract_most_common_cards([5,5, 4,4,4,4,4, 2, 2, 7]))
# [5,5] weil gerade Anzahl, obwohl 4,4,4,4,4 mehr Karten wären
print(extract_most_common_cards([5,5,5, 4,4,4,4,4, 2, 7]))
# [4,4,4,4,4] weil es keine gerade Anzahl an Karten gibt
Tombery
User
Beiträge: 29
Registriert: Mittwoch 10. Juli 2019, 19:56

Großes Dankeschön,

Code: Alles auswählen

def max_min(hand):
    value, count = max(
        Counter(hand).items(),
        key=lambda pair: (pair[1], 0 if pair[0] == 13 else pair[0])
    )
    return [value] * count
Dies hier läuft perfekt wie gewünscht.
Wenn nur alle meine Funktionen so schön wären.
Ich glaub wenn ich euch zeige wie ich den Joker programmiert hab, fallt ihr alle Tod um. :lol:
Antworten