Фильтровать словарь по ключам - PullRequest
2 голосов
/ 21 апреля 2020

Ввод

dict = {
    "samp1": "x",
    "samp2": "x",
    "exp1": "x"
}

ex = dict((k, v) for k, v in dict.items() if k in samp+str(range(1,10)))

Ожидаемый вывод

ex = {
    "samp1":"x",
    "samp2":"x"
}

Мой код получает ошибку в этой строке str(range(1,10)).

Как это сделать if k in samp1 samp2 samp3...samp10?

Ответы [ 4 ]

2 голосов
/ 21 апреля 2020

Я бы предложил использовать re.match здесь, чтобы проверить, начинается ли key с указанного шаблона:

import re
{k:v for k, v in d.items() if re.match(r'^samp[0-9]', k)}
# {'samp1': 'x', 'samp2': 'x'}

В качестве альтернативы вы можете использовать startswith, что также может занять tuple:

m = tuple(['samp'+str(i) for i in range(10)],)
{k:v for k, v in d.items() if k.startswith(m)}
# {'samp1': 'x', 'samp2': 'x'}
1 голос
/ 21 апреля 2020

Попробуйте это ниже:

ex = {}
for obj in dict:
    if obj.startswith('samp'):
        ex[obj] = dict[obj]
print(ex)
1 голос
/ 21 апреля 2020

Просто чтобы указать, что не так в вашем коде, я попытался изменить мин. Попробуйте это (Один использует f-string и dict-compceptionsion ):

dict={
    "samp1":"x",
    "samp2":"x",
    "exp1":"x"
}
li = [F"samp{i}" for i in range(1,11)]
ex = {k:v for k, v in dict.items() if k in li}
print(ex)

Вывод:

{'samp1': 'x', 'samp2': 'x'}

Другой (Спасибо в @OlvinRoght для isDecimal.):

dict = {
    "samp1":"x",
    "samp2":"x",
    "samp12":"x",
    "samp":"x",
    "sampxyz":"x",
    "exp1":"x"
}
ex = {k:v for k, v in dict.items() if k.startswith("samp") and k[4:].isdecimal() and (0 < int(k[4:]) <= 10) }
print(ex)

Вывод:

{'samp1': 'x', 'samp2': 'x'}
0 голосов
/ 21 апреля 2020

С filter и регулярным выражением:

import re

idict = { 
    "samp1": "x",
    "samp2": "x",
    "exp1": "x" 
}

MATCH = re.compile(r'samp[1-9]')
odict = dict(filter(lambda kv: MATCH.fullmatch(kv[0]), idict.items()))
print(odict)

Обновление: если количество ключей всегда мало, как в вопросе, может быть более эффективно извлечь только эти несколько ключей (если настоящее, конечно). Что-то вроде:

mykeys = ["samp1", ..., "samp9"]
odict = {key: idict[key] for key in mykeys if key in idict}
...