Je veux compter les mêmes éléments de deux listes. Les listes peuvent avoir des éléments en double, donc je ne peux donc pas convertir cela en jeux et utilisez et opérateur.
a=[2,2,1,1] b=[1,1,3,3]
3 Réponses :
Utiliser des ensembles est le plus efficace, mais vous pouvez toujours faire r = [i pour i in l1 si i i-l2] code>. p>.
Une différence distincte: la méthode SET () et SET () suggérée () renvoie une seule valeur commune entre les deux listes (défini ([1]) dans cet exemple) alors que votre solution reviendra [1, 1] et ainsi de suite .
Merci, mais est-ce une solution de perfomence plus?
Je veux la fonction qui retourne [1,1]
@THOMAS: cette solution donne [1, 1] code> si
l1 == [1, 1] code> et
l2 == [1] code>, mais Il donne
[1] code> si
l1 == [1] code> et
l2 == [1, 1] code>. Est-ce le comportement que vous voulez?
dans Python 3.x (et Python 2.7, quand il est publié), vous pouvez utiliser Collections.Counter Pour ce:
from collections import defaultdict def list_intersection(list1, list2): bag = defaultdict(int) for elt in list1: bag[elt] += 1 result = [] for elt in list2: if elt in bag: # remove elt from bag, making sure # that bag counts are kept positive if bag[elt] == 1: del bag[elt] else: bag[elt] -= 1 result.append(elt) return result
Si sac [elt]: code> ajoute un élément
ELT: 0 code> au sac lorsque
elt in bac code> est faux. Quand (comme l'OP) Il y a peu de doublons, il peut être préférable de faire
si elt dans sac et sac [elt]: code> sinon le sac peut devenir gonflé avec des valeurs 0 inutiles.
@John Machin: Hmm. Bon point. Une alternative serait de veiller à ce que les comptes de sac sont toujours strictement positifs, en suivant un sac [elt] - = 1 code> avec un
si pas le sac [elt]: del sac [elt] code>. Ensuite, le test
si code> pourrait simplement être
si elt in sac: code>, qui lit plus bien. Je vais éditer la réponse.
Silentghost, Mark Dickinson et Lo'oris ont raison, merci beaucoup à signaler ce problème - j'ai besoin d'une partie commune des listes, donc pour:
a = [1,1,1,2] p>
b = [1,1,3,3] p>
résultat devrait être [1,1] p>
Désolé pour commenter dans un endroit non approprié - je me suis inscrit aujourd'hui. < / p>
J'ai modifié vos solutions: p> 1 p> p>
Bienvenue! Vous voudrez peut-être envoyer un e-mail @stackoverflow.com code> et leur demander de fusionner votre compte nouvellement enregistré avec le compte temporaire précédent. Voir:
Pourquoi ne voulez-vous pas utiliser des ensembles?
J'ai des éléments dupliqués dans la liste
Quelles sont les valeurs de retour attendues pour
[1, 2, 1] code> et
[1, 3, 2] code>?
... et quelle est la sortie souhaitée pour
[1, 2, 2] code> et
[1, 1, 2] code>?
Je suppose qu'il attend
[1, 2] code> dans les deux cas
Basé sur un commentaire ci-dessous, il veut [1,2,1] dans le premier cas. Il n'est toujours pas clair ce qu'il veut pour la seconde.