7 votes

intersection de trois ensembles en python ?

Actuellement, je suis coincé en essayant de trouver l'intersection de trois ensembles. Ces ensembles sont en fait des listes que je convertis en ensembles, et dont j'essaie ensuite de trouver l'intersection.

Voici ce que j'ai pour l'instant :

for list1 in masterlist:
    list1 = thingList1
for list2 in masterlist:
    list2 = thingList2
for list3 in masterlist:
    list3 = thingList3

d3 = [set(thingList1), set(thingList2), set(thingList3)] 
setmatches c = set.intersection(*map(set,d3)) 
print setmatches

et je reçois

set([]) 
Script terminated.

Je sais qu'il y a un moyen beaucoup plus simple et plus efficace de faire cela, mais je n'arrive pas à en trouver un...

EDITAR

Ok, voici ce que j'ai maintenant.

setList=()
setList2=()
setList3=()

for list1 in masterlist:
    setList=list1
    for list2 in masterlist:
        setList2=list2
        for list3 in masterlist:
            setList3=list3

setmatches=set(setList) & set(setList2) & set(setList3)
print setmatches

Cela ne me donne toujours pas ce que je cherche : la seule correspondance que je me suis assuré de trouver dans chaque liste. Ça me donne ce qui ressemble à une addition de tous les ensembles.

30voto

mjgpy3 Points 3346

Je pense que vous cherchez simplement :

set(thingList1) & set(thingList2) & set(thingList3)

L'esperluette est une intersection en Python (et dans certains autres langages également).

4voto

Joran Beasley Points 28451
set1 & set2 & set3

devrait fonctionner ... du moins je le pense

>>> set((1,2,3)) & set((2,3,4)) & set((3,4,5))
set([3])

3voto

lvc Points 12046
set.intersection(*map(set,d3)) 

Will fonctionne réellement, parce que d3 contient déjà des séries que vous pouvez simplement faire :

set.intersection(*d3)

Et, en fait, seule la première doit être une set - les autres peuvent être n'importe quel itérable, et intersection les notifiera d'elle-même.

Le problème que vous rencontrez ne semble pas être dans ce code - plutôt,

for list1 in masterlist:
    list1 = thingList1

On ne mettra pas vraiment quelque chose dans thingList1 . C'est difficile à dire sans voir ce que masterlist ressemble, mais vous pouvez vouloir quelque chose comme :

for list1 in masterlist:
   thingList1[:] = list1

print vos trois listes avant de faire l'intersection pour vous assurer qu'elles contiennent ce que vous attendez.

2voto

defuz Points 5575

Vous avez besoin de quelque chose comme ça :

frozenset(list1) & frozenset(list2) & frozenset(list1)

2voto

Izkata Points 3634

Une liste d'ensembles, vous dites ?

In [1]: mylist = [ [1, 2, 3, 4], [3, 4, 5, 6, 7], [2, 3, 4, 5, 6] ]

In [2]: result = set(mylist[0])

In [3]: for item in mylist:
   ...:     result = result.intersection(item)
   ...:     
   ...:     

In [4]: result
Out[4]: set([3, 4])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X