Hvordan til at finde fælles elementer i liste af lister?

Jeg forsøger at regne ud, hvordan at sammenligne en n antallet af lister til at finde fælles elementer.
For eksempel:

p=[ [1,2,3],
    [1,9,9],
      ..
      ..
    [1,2,4]

>> print common(p)
>> [1]

Nu, hvis jeg kender antallet af elementer, som jeg kan gøre comparions som:

for a in b:
  for c in d:
    for x in y:
...

men som ikke virker, hvis jeg ikke ved, hvor mange elementer p har. Jeg har kigget på denne løsning, der sammenligner to lister
https://stackoverflow.com/a/1388864/1320800

men efter at have tilbragt 4 timer forsøger at finde en måde at lave rekursive en løsning, som stadig unddrager sig mig så enhver hjælp ville være meget værdsat!

eventuel kopi af Python: Sådan finder du en liste vejkrydset?
gør din løsning er nødt til at være rekursiv? Kan du bruge de indbyggede intersect funktioner (det er, er dette hjemmearbejde?)?
Jeg vidste ikke, at den korrekte betegnelse var “kryds”, så tak for det. Det vil hjælpe mig med at se på det mere. Nu, det behøver ikke at være rekursiv, men vi har lige lært om rekursion, så jeg regnede med, at jeg sandsynligvis ville have til at sammenligne p[0] og s[1] og derefter fodre det resultat, at resten af de elementer, der er hvorfor jeg troede, at det sandsynligvis ville være en rekursiv løsning

OriginalForfatteren 8bits | 2012-04-08

7 svar

  1. 42

    Du er på udkig efter det sæt kryds i alle underniveauer, og de data, du skal bruge for sæt operationer er et sæt:

    result = set(p[0])
    for s in p[1:]:
        result.intersection_update(s)
    print result
    +1 for hjælp sæt, hvor sæt er den rette datatype.
    Tak for svaret.. jeg vidste intet om, der beskriver, så jeg har tænkt mig at forske lidt mere. Men fra en indledende test p = [[1,2,3], [1,3], [8,1]] den løsning, du foreslog i stedet for [1] returns [8,1] ?
    Den første version af dette svar havde en forkert print erklæring i slutningen. Selvfølgelig skal vi udskrive result, ikke s.
    Alternativt, result &= s.
    tak for din hjælp! det virker fantastisk, og nu ved jeg hvad jeg sætter, er 🙂

    OriginalForfatteren Sven Marnach

  2. 5

    Hvorfor ikke bare:

    set.intersection(*map(set, p))

    Resultat:

    set([1])

    Eller som denne:

    ip = iter(p)
    s = set(next(ip))
    s.intersection(*ip)

    Resultat:

    set([1])

    edit:

    kopieret fra konsol:

    >>> p = [[1,2,3], [1,9,9], [1,2,4]]
    >>> set.intersection(*map(set, p))
    set([1])
    >>> ip = iter(p)
    >>> s = set(next(ip))
    >>> s.intersection(*ip)
    set([1])
    Jeg ved ikke, om jeg mangler noget, men passerer p=[ [1,2,3], [1,9,9], [1,2,4]] ikke synes at arbejde
    Se venligst min redigering.

    OriginalForfatteren pillmuncher

  3. 5

    En simpel løsning (one-line) er:

    set.intersection(*[set(list) for list in p])

    OriginalForfatteren WindChimes

  4. 1
    reduce(lambda x, y: x & y, (set(i) for i in p))
    reduce ikke betragtes som “Pythonic” af mange. Også, er din version kræver, at hver liste konverteres til et sæt, og en yderligere ny indstillet til at være oprettet for hvert skæringspunkt. Sven ‘ s version skaber kun ét sæt.
    Forstået. Stadig, det er en arbejdsgruppe løsning (omend en smule ineffektiv).

    OriginalForfatteren Joel Cornett

  5. 1
    p=[ [1,2,3],
        [1,9,9],
        [1,2,4]]
    
    ans = [ele[0] for ele in zip(*p) if len(set(ele)) == 1]

    Resultat:

    >>> ans
    [1]
    Prøv dette med s=[[1,2],[2,1]]. Eller endda p=[[1,2],[2]].
    Min kode virker kun, hvis vi kigger på alle fælles elementer, der er også i samme position; det er hele essensen af, zip(*p) ting. Det er, hvad jeg troede, OP ønskede, men at læse det indlæg igen, jeg har nok misforstået. Jeg er også forudsat, at hver underliste har samme længde.
    Også, zip vil slippe elementer, hvis de lister, der varierer i længde.
    præcis, underniveauer ikke altid af samme længde, tak for hjælpen alligevel!

    OriginalForfatteren Akavall

  6. 0

    Du er på udkig efter det sæt kryds i alle underniveauer, og de data, du skal bruge for sæt operationer er et sæt:

    result = set(p[0])  
    for s in p[1:]:
       result.intersection_update(s)
    print result

    Der er dog en begrænsning på 10-lister i en liste. Noget større årsager “resultat” liste for at være ude af rækkefølge. Forudsat, at du har lavet ‘resultat’ i en liste af list(result).

    Sørg for, at du result.sort() at sikre, at den er bestilt, hvis du er afhængige af at være på den måde.

    OriginalForfatteren spearna

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *