【问题标题】:Accessing value in a dict ignoring the key's second value忽略键的第二个值访问字典中的值
【发布时间】:2018-05-29 00:52:32
【问题描述】:

我有一个字典 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))

【问题讨论】:

  • 一个字典的样子和期望的输出应该是什么的例子会有很大帮助。显示您创建的if/else 也很友好。
  • 对不起,你是对的。我编辑添加了两者。

标签: python dictionary


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    没有。字典键是散列的,你不能用部分元组匹配来查询它们的数据库样式。

    可以做什么,如果你确定要么 0 或 1 存在(但是,为了清楚起见,在 Python 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
    

    【讨论】:

    • 如果 (10, 0)(10, 1) 都存在,则此代码对于 Python 版本 具有未确定的行为
    • 我不明白为什么这种方法在 Python .get() 在这些版本中做了什么?
    【解决方案3】:

    假设你有这样的东西:

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

    您想要获取所有与以开头的键对应的值,例如,10,又名(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]
    

    【讨论】:

    • 谢谢!我没有指定(我的错)每个键的第一个值是唯一的。但解决方案有效,谢谢!
    【解决方案4】:

    正如大家已经提到的那样,您不能开箱即用地做到这一点。现在,如果您需要两种方法来获取值 - 一种来自完整键,另一种来自“部分”键,解决方案可能是并行维护 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 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      相关资源
      最近更新 更多