检查参数(元组)是否在字典中

时间:2017-09-18 01:39:48

标签: python dictionary tuples

我真的在解压缩和迭代这本词典中的元组时苦苦挣扎。本质上,该函数采用两个坐标位置(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

3 个答案:

答案 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