Seite 1 von 1

ignorieren eines bestimmten Wertes

Verfasst: Montag 29. Juli 2019, 15:22
von Tombery
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.

Re: ignorieren eines bestimmten Wertes

Verfasst: Montag 29. Juli 2019, 15:48
von __blackjack__
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

Re: ignorieren eines bestimmten Wertes

Verfasst: Montag 29. Juli 2019, 15:51
von Sirius3
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

Re: ignorieren eines bestimmten Wertes

Verfasst: Montag 29. Juli 2019, 18:34
von Tombery
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: