Derzeit stecke ich fest und versuche, den Schnittpunkt von drei Sätzen zu finden. Nun, diese Mengen sind wirklich Listen, die ich in Mengen umwandle und dann versuche, den Schnittpunkt von zu finden.

Folgendes habe ich bisher:

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

Und ich bekomme

set([]) 
Script terminated.

Ich weiß, dass es einen viel einfacheren und besseren Weg gibt, aber ich kann keinen finden ...

BEARBEITEN

Okay, hier ist was ich jetzt habe.

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

Gibt mir immer noch nicht das, wonach ich suche: Welches ist das Match, das ich in jeder Liste sichergestellt habe? Es gibt mir, wie es aussieht, eine Ergänzung aller Sets.

4
thephfactor 9 Okt. 2012 im 01:36

6 Antworten

Beste Antwort

Ich denke, Sie suchen einfach:

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

Das kaufmännische Und ist eine Schnittmenge in Python (und einigen anderen Sprachen).

20
mjgpy3 14 Apr. 2017 im 17:39

Eine Liste von Sets, sagst du?

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])
1
Izkata 8 Okt. 2012 im 21:41
set.intersection(*map(set,d3)) 

Funktioniert tatsächlich, da d3 bereits Sets enthält, können Sie Folgendes tun:

set.intersection(*d3)

Tatsächlich muss nur der erste ein set sein - die anderen können iterierbar sein, und intersection setzt sie selbst fest.

Das Problem, das Sie haben, scheint nicht in diesem Code zu liegen - vielmehr

for list1 in masterlist:
    list1 = thingList1

Wird eigentlich nichts in thingList1 einfügen. Es ist schwer zu sagen, ohne zu sehen, wie masterlist aussieht, aber Sie möchten vielleicht etwas wie:

for list1 in masterlist:
   thingList1[:] = list1

print Ihre drei Listen, bevor Sie die Kreuzung durchführen, um sicherzustellen, dass sie das enthalten, was Sie erwarten.

2
lvc 10 Okt. 2012 im 23:01
set1 & set2 & set3

Sollte funktionieren ... zumindest denke ich

>>> set((1,2,3)) & set((2,3,4)) & set((3,4,5))
set([3])
4
Joran Beasley 8 Okt. 2012 im 21:37

Sie brauchen so etwas:

frozenset(list1) & frozenset(list2) & frozenset(list1)
2
defuz 8 Okt. 2012 im 21:49

Dies sollte den Trick machen:

reduce(lambda x,y: x&y, mysetlist)
2
RussellStewart 27 März 2014 im 18:22