我真的在解压缩和迭代这本词典中的元组时苦苦挣扎。本质上,该函数采用两个坐标位置(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
答案 0 :(得分:2)
您可以直接将元组与元组进行比较:
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
答案 1 :(得分:2)
您可以使用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)
这是有效的,因为chain()
与*
应用于bonuses.values()
的{{1}}解包运算符结合使用时,会有效地将字典的值展平为单个列表,其成员资格可以轻松实现用in
测试。
如果你的函数返回一个布尔值,你的函数可以进一步简化:
def find_bonus(pos):
return pos in chain(*bonuses.values())
答案 2 :(得分:-1)
你可以这样做。 (假设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