Les éléments communs entre les deux listes n'utilisant pas de jeux en Python
Je veux compter les mêmes éléments de deux listes. Les listes peuvent avoir les éléments en double, donc je ne peux pas convertir ce de jeux et d'utiliser & opérateur de.
a=[2,2,1,1]
b=[1,1,3,3]
ensemble(a) & set(b) de travail
a & b ne fonctionnent pas
Il est possible de le faire sans définir et dictonary?
Pourquoi ne voulez-vous pas à utiliser des ensembles?
J'ai les éléments en double dans la liste
quel est le rendement attendu des valeurs pour
... et ce qui est la sortie désirée pour
Je suppose qu'il s'attend à ce
J'ai les éléments en double dans la liste
quel est le rendement attendu des valeurs pour
[1, 2, 1]
et [1, 3, 2]
?... et ce qui est la sortie désirée pour
[1, 2, 2]
et [1, 1, 2]
?Je suppose qu'il s'attend à ce
[1, 2]
dans les deux casOriginalL'auteur Thomas | 2010-04-28
Vous devez vous connecter pour publier un commentaire.
En Python 3.x (et Python 2.7, quand il sortira), vous pouvez utiliser les collections.Compteur pour cela:
Voici une alternative à l'aide les collections.defaultdict (disponible dans Python 2.5 et ultérieur). Il a la belle propriété que l'ordre de la raison est déterministe (il correspond essentiellement à l'ordre de la seconde liste).
Pour ces deux solutions, le nombre d'occurrences de chaque élément
x
dans la liste de sortie est le minimum du nombre d'occurrences dex
dans les deux listes. Il n'est pas clair à partir de votre question de savoir si c'est le comportement que vous souhaitez.if bag[elt]:
ajoute un élémentelt: 0
pour le sac, quandelt in bag
est faux. Lorsque (comme l'OP fait allusion) il y a quelques doublons, il peut être préférable de neif elt in bag and bag[elt]:
sinon sac peut devenir énorme avec inutile valeurs à 0.Machin: Hmm. Bon point. Une alternative serait de faire en sorte que le sac de compte sont toujours strictement positif, par la suite
bag[elt] -= 1
avec unif not bag[elt]: del bag[elt]
. Puis leif
test pourrait être simplementif elt in bag:
, qui se lit plus joliment. Je vais modifier la réponse.OriginalL'auteur Mark Dickinson
À l'aide des ensembles est le plus efficace, mais vous pouvez toujours faire
r = [i for i in l1 if i in l2]
.Merci, mais est un peu plus perfomence solution?
Je veux de la fonction de retour [1,1]
Cette solution permet
[1, 1]
sil1 == [1, 1]
etl2 == [1]
, mais il donne[1]
sil1 == [1]
etl2 == [1, 1]
. C'est que le comportement que vous voulez?OriginalL'auteur Max Shawabkeh
SilentGhost, Mark Dickinson et Lo or est sont droit, Merci beaucoup pour signaler ce problème - j'ai besoin de partie commune de listes, pour:
a=[1,1,1,2]
b=[1,1,3,3]
résultat devrait être [1,1]
Désolé pour le commentaire n'est pas indiqué le lieu - je me suis inscrit aujourd'hui.
J'ai modifié le vôtre solutions:
1
[email protected]
et leur demander de fusionner votre compte nouvellement enregistré avec le précédent compte temporaire. Voir: meta.stackexchange.com/questions/18232/...OriginalL'auteur Thomas