我有一个字典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))
答案 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
中。