在dict中访问值而忽略键的第二个值

时间:2018-05-28 10:45:29

标签: python dictionary

我有一个字典L,其键是长度为2的元组:第一个元素是索引,第二个元素是0或1.我正在定义几个函数。在其中一个中,我需要考虑元组的第二个元素,因此我需要它留在那里。 但是现在我在另一个功能方面遇到了麻烦,我根本不关心它。我必须检索给定索引的dict值(元组的第一个元素),但我不知道第二个值是0还是1。 是否有一个静音变量,或者我可以传递的东西,它说“0或1”?

为了让事情更清楚,我希望有类似的东西:

needed_value = L.get((given_index, either))

其中“或”可以是0或1。

现在,我创建了一个if / else,但它似乎很愚蠢,因为它们的身体都只是赋值。

非常感谢, 我希望我没有错过这个问题的预先存在的解决方案!

编辑:

我的词典是这样的:

L = {(7, 1): 0, (2, 0): 1, (5, 1): 4, (1, 1): 2, (11, 0): 3}

所以,我确定键中的第二个值是0或(不包括)1。此外,第一个值是唯一的(如果它是相关的)。

if / else的代码是(或多或少,我不再拥有它):

if (i, 1) in L.keys():
            tau = L.get((i, 1))

elif (i, 0) in L.keys():
            tau = L.get((i, 0))

4 个答案:

答案 0 :(得分:2)

不,没有办法做到这一点。如果您只需要通过第一部分检索元素,那么您应该将其作为键并将其他部分存储在值中。

答案 1 :(得分:1)

没有。字典键是经过哈希处理的,您不能使用部分元组匹配来查询数据库样式。

使用dict.get的可选后备参数:

L = {(10, 1): 5, (10, 2): 6, (10, 3): 7}

val = L.get((10, 0), L.get((10, 1)))

print(val)  # 5

或者,考虑到(10, 0)(10, 1)都存在的情况,您可以使用自定义函数:

L = {(10, 1): 5, (10, 2): 6, (10, 3): 7, (10, 0): 8}

def get_val(x, key):
    try:
        return x[(key, 0)]
    except KeyError:
        return x[(key, 1)]

val = get_val(L, 10)

print(val)  # 8

答案 2 :(得分:0)

假设你有类似的东西:

L = {(10, 1): 5, (10, 0): 6, (20, 0): 7}

您希望获取所有与以#开头的关键字对应的值,例如(10, 0)(10, 1)

to_match = 10

你可以这样做:

res = [v for k, v in L.items() if any(k == (to_match, x) for x in (0, 1))]

返回:

[5, 6]

答案 3 :(得分:0)

正如大家已经提到的那样,你无法开箱即用。现在,如果您需要两种方式来获取价值 - 一个来自完整的密钥,另一个来自"部分"关键,解决方案可能是并行维护key[0]=>[keys...]映射,即:

L = {(10, 1): 5, (10, 0): 6, (20, 0): 7}
index = defaultdict(list)
for key in L:
    index[key[0]].append(key)

然后你可以得到"完成"部分键的键

keys = index.get(10)
values = [L[k] for k in keys]

当然,这意味着您必须确保将索引保持最新,因此您需要将所有内容包装在一个类中,以确保L的所有更新都反映在index中。