Descobri, que há uma dúvida relacionada, sobre como saber se existe pelo menos um item em uma lista:
Como verificar se um dos seguintes itens está em uma lista?
Mas qual é a melhor e pítônica maneira de descobrir se todos os itens existem em uma lista?
Pesquisando nos documentos, encontrei esta solução:
>>> l = ['a', 'b', 'c']
>>> set(['a', 'b']) <= set(l)
True
>>> set(['a', 'x']) <= set(l)
False
Outra solução seria esta:
>>> l = ['a', 'b', 'c']
>>> all(x in l for x in ['a', 'b'])
True
>>> all(x in l for x in ['a', 'x'])
False
Mas aqui você deve digitar mais.
Existe alguma outra solução?
set(smaller) <= set(larger)
?Respostas:
Operadores como
<=
em Python geralmente não são substituídos para significar algo significativamente diferente do que "menor ou igual a". É incomum que a biblioteca padrão faça isso - para mim, cheira a uma API legada.Use o método equivalente e com nome mais claro
set.issubset
,. Observe que você não precisa converter o argumento em um conjunto; ele fará isso por você, se necessário.fonte
<=
e oissubset
significado da mesma coisa. Por que você não gosta disso?<=
significa para um conjunto sem procurar nos documentos ou ter um conhecimento prévio do que significa na teoria dos conjuntos, enquanto todos sabem o queissubset
significa automaticamente.Eu provavelmente usaria
set
da seguinte maneira:ou do outro modo :
Acho que é um pouco mais legível, mas pode ser exagerado. Os conjuntos são particularmente úteis para calcular a união / interseção / diferenças entre as coleções, mas pode não ser a melhor opção nesta situação ...
fonte
MySet.issubset(MyOtherSet)
eMySet <= MyOtherSet
são iguais.<=
o significado que tem para as sequências: pode-se esperar que signifique 'é uma subsequência' em vez de ordenação lexicográfica.<=
com sequências também parece estranho, de alguma forma ...set(['a','a']).issubset(['a'])
retornaTrue
.Gosto desses dois porque parecem os mais lógicos, sendo o último mais curto e provavelmente mais rápido (mostrado aqui usando
set
a sintaxe literal que foi portada para o Python 2.7):fonte
E se suas listas contiverem duplicatas como esta:
Os conjuntos não contêm duplicatas. Portanto, a linha a seguir retorna True.
Para contar as duplicatas, você pode usar o código:
Portanto, a linha a seguir retorna False.
fonte
Isso era o que eu estava pesquisando online, mas infelizmente não encontrei online, mas enquanto fazia experiências no interpretador Python.
e se você tem uma lista looonga de variáveis mantidas em um
sublist variable
fonte
Um exemplo de como fazer isso usando uma expressão lambda seria:
fonte
Não é o caso da OP, mas - para quem quer declarar interseção em dictos e acabou aqui devido a uma busca ruim no Google (por exemplo, eu) - você precisa trabalhar com
dict.items
:Isso
dict.items
ocorre porque retorna tuplas de pares de chave / valor e, assim como qualquer objeto em Python, são intercambiavelmente comparáveisfonte