2017-09-18 2 views
0

Ich habe wirklich Schwierigkeiten beim Entpacken und Iterieren über die Tupel in diesem Wörterbuch. Im Wesentlichen nimmt die Funktion eine zweikoordinierte Position (Wx, Wy) ein und prüft, ob sie sich in einem der Tupel befindet, die sich in einer Liste, im Wörterbuch, Boni befinden. Ich habe das Gefühl, ich übertreibe es oder bin einfach weit weg.Überprüfen Sie, ob das Argument (Tupel) im Wörterbuch ist

Thanks :)

bonuses = {1: [(3,3)], 2: [(1, 0), (0, 3), (2, 4), (5, 2)]} 

def find_bonus(pos): 
""" Check if position is valid""" 

    bonus_info = dict.values(bonuses) 

    for (Wx, Wy) in pos: 
     if (Wx, Wy) in tuple(bonus_info): 
      return pos 
    else: 
    return False 
+0

Dies wird schmerzhaft langsam für viele/lange Listen in der 'dict'. Sie benötigen eine andere Struktur (vielleicht eine 'Menge 'aller Tupel), wenn Sie nach vielen Positionen suchen wollen. –

Antwort

2

Sie Tupel direkt auf Tupel vergleichen können:

1- Iterierte über die Werten des Wörterbuchs. 2- überprüfen, ob pos ist in den Werten und True zurück, wenn es
ist 3-, wenn pos nicht überall gefunden wurde, kehren False

bonuses = {1: [(3,3)], 2: [(1, 0), (0, 3), (2, 4), (5, 2)]} 

def find_bonus(pos): 
""" Check if position is valid""" 

    for valid_pos in bonuses.values(): 
     if pos in valid_pos: 
      return pos # <-- or return True, depending if pos can ever evaluate at False. 
    return False 
2

können Sie verwenden itertools.chain():

from itertools import chain 

def find_bonus(pos): 
    return pos if pos in chain(*bonuses.values()) else False 

Demo :

>>> bonuses = {1: [(3,3)], 2: [(1, 0), (0, 3), (2, 4), (5, 2)]} 
>>> find_bonus((100,10)) 
False 
>>> find_bonus((10,10)) 
False 
>>> find_bonus((1,0)) 
(1, 0) 
>>> find_bonus((3,3)) 
(3, 3) 
>>> find_bonus((5,2)) 
(5, 2) 

Dies funktioniert, weil chain(), kombiniert mit dem * entpackenden Operator, der auf bonuses.values() angewendet wurde, flacht die Werte des Wörterbuchs effektiv in eine einzige Liste zusammen, für die die Mitgliedschaft leicht mit in getestet werden kann.

Ihre Funktion kann weiter vereinfacht werden, wenn Sie es ein boolean zurückgeben haben:

def find_bonus(pos): 
    return pos in chain(*bonuses.values()) 
-1

Sie können dies nur tun, anstatt. (Angenommen pos ist ein einzelnes Tupel)

bonus_info = set(i for i in j for j in bonuses.values()) 
def find_bonus(pos): 
    if pos in bonus_info: 
     return pos 
    else: 
     return None 
Verwandte Themen