Доступ к значению в dict, игнорирующем второе значение ключа - PullRequest
0 голосов
/ 28 мая 2018

У меня есть словарь L, ключи которого имеют кортеж длины 2: первый элемент - индекс, второй - 0 или 1. Я определяю несколько функций.В одном из них мне нужно рассмотреть второй элемент кортежа, поэтому мне нужно, чтобы он оставался там.Но теперь у меня проблемы с другой функцией, в которой мне все равно.Я должен получить значение dict данного индекса (первый элемент кортежа), но я понятия не имею, является ли второе значение 0 или 1. Есть ли переменная отключения или что-то, что я могу передать, и он говорит"или 0 или 1"?

Чтобы прояснить ситуацию, я хотел бы иметь что-то вроде:

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

, где «либо» может быть 0 или 1.

На данный момент я создалесли / еще, но это кажется глупым, потому что оба их тела просто присваивают значение.

Большое спасибо, я надеюсь, что я не пропустил ранее существовавшее решение для этой проблемы!

Редактировать:

Мой диктант похож на:

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 голосов
/ 28 мая 2018

Как все уже упоминали, вы не можете сделать это из коробки.Теперь, если вам нужны оба способа получения значений: один из полного ключа, а другой из «частичного» ключа, решение может состоять в том, чтобы поддерживать отображение 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.

0 голосов
/ 28 мая 2018

Нет.Ключи словаря хешируются, и вы не можете запрашивать их в стиле базы данных с частичными совпадениями кортежей.

Что вы можете сделать, если вы уверены, что либо 0, либо1 существует (но, для ясности и в Python <3.6, а не оба), должен использовать необязательный запасной аргумент <code>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
0 голосов
/ 28 мая 2018

Предполагая, что у вас есть что-то вроде этого:

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

И вы хотите получить все значения, которые соответствуют ключам, начинающимся с, например, 10 ,aka (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]
0 голосов
/ 28 мая 2018

Нет, это невозможно сделать.Если вам нужно извлечь элементы только по первой части, вам следует указать этот ключ и сохранить другую часть в значении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...