[英]Check if argument (tuple) is in dictionary
我真的在為這本字典中的元組解壓縮和迭代而苦苦掙扎。 本質上,該函數采用兩個坐標位置(Wx,Wy),並檢查其是否位於任一列表(在字典中)中的元組之一中,是否存在加成。 我覺得我想得太多了,或者還很遙遠。
謝謝 :)
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
您可以直接將元組與元組進行比較:
1-迭代字典的值。 2-檢查pos
是否在值中,如果是,則返回True
3-如果在任何地方都找不到pos,則返回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
您可以使用itertools.chain()
:
from itertools import chain
def find_bonus(pos):
return pos if pos in chain(*bonuses.values()) else False
演示:
>>> 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)
之所以bonuses.values()
,是因為chain()
與應用於bonuses.values()
的*
拆包運算符結合使用時,可以有效地將字典的值展平到一個列表中,可以使用in
輕松測試其成員資格。
如果您返回布爾值,則可以進一步簡化您的函數:
def find_bonus(pos):
return pos in chain(*bonuses.values())
您可以改為執行此操作。 (假設pos是一個元組)
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.