簡體   English   中英

在字典中訪問值而忽略鍵的第二個值

[英]Accessing value in a dict ignoring the key's second value

我有一個字典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或1的情況下(但,為了清晰和在Python <3.6,而不是兩個),是使用的可選備用參數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

假設您有這樣的事情:

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

並且您想要獲取與以10開頭的鍵對應的所有 ,又名(10, 0) 10,0 (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]

正如大家已經提到的那樣,您不能開箱即用。 現在,如果您需要兩種方法來獲取值-一種是從完整鍵獲取,另一種是從“部分”鍵獲取,則解決方案可能是並行維護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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM