Eu tenho um dicionário parecido com este:
grades = {
'alex' : 11,
'bob' : 10,
'john' : 14,
'peter': 7
}
e uma lista de nomes students = ('alex', 'john')
Preciso verificar se todos os nomes students
existem como chaves em grades
dict.
grades
pode ter mais nomes, mas todos os nomes em students
devem estar emgrades
Deve haver uma maneira direta de fazer isso, mas ainda sou novo no python e não consigo descobrir. tentei if students in grades
, não funcionou.
Nos casos reais, as listas serão muito maiores.
Respostas:
Use
all()
:if all(name in grades for name in students): # whatever
fonte
set(students) - grades.keys()
em Python 3.any(k in my_string for k in keys)
?>>> grades = { 'alex' : 11, 'bob' : 10, 'john' : 14, 'peter': 7 } >>> names = ('alex', 'john') >>> set(names).issubset(grades) True >>> names = ('ben', 'tom') >>> set(names).issubset(grades) False
Chamar
class
é inválido, então mudei paranames
.fonte
all()
. Será sempre O (m + n), onde m e n são os respectivos tamanhos denames
egrades
. O usoall()
será O (m) e pode ser um atalho.Assumindo alunos conforme definido
if not (students - grades.keys()): print("All keys exist")
Se não, converta em conjunto
if not (set(students) - grades.keys()): print("All keys exist")
fonte
Você pode testar se várias chaves estão em um dicionário aproveitando que
<dict>.keys()
retorna aset
.Esta lógica no código ...
if 'foo' in d and 'bar' in d and 'baz' in d: do_something()
pode ser representado mais resumidamente como:
if {'foo', 'bar', 'baz'} <= d.keys(): do_something()
O
<=
operador para conjuntos testa se o conjunto à esquerda é um subconjunto do conjunto à direita. Outra maneira de escrever isso seria<set>.issubset(other)
.Existem outras operações interessantes suportadas por conjuntos: https://docs.python.org/3.8/library/stdtypes.html#set
Usar esse truque pode condensar muitos lugares no código que verificam várias chaves, conforme mostrado no primeiro exemplo acima.
Listas inteiras de chaves também podem ser verificadas usando
<=
:if set(students) <= grades.keys(): print("All studends listed have grades in your class.") # or using unpacking - which is actually faster than using set() if {*students} <= grades.keys(): ...
Ou se
students
também é um ditado:if students.keys() <= grades.keys(): ...
fonte