python kolla om listor har identiska listor i sig

Permalänk

python kolla om listor har identiska listor i sig

Tjenare jag har ett problem jag har två listor med listor i båda så som

l1=[[0,4],[0,5]]
l2=[[0,4],[0,7]]

hur gör jag för att kolla om en av listorna innehåller samma lista?

testade

if(list(set(l1) & set(l2)))!=[]:
print("gg")

vilket gav

TypeError: unhashable type: 'list'

tacksam för svar

Permalänk

@madmaster32:

if l1== l2 and l1 and l2: print("GG!") else: print("försök igen...")

Den kollar l1 är lika med l2 och om det finns något i l1 och l2.
Är någon av dom None eller tom så blir det false.

Permalänk
Medlem

@madmaster32:
Problemet du upplever är att du inte kan ha ett set av listor. Detta eftersom ett element i ett set ska vara hashbart, eftersom en lista är ändringsbar (mutable) så går det inte att med säkerhet hasha.

otestade lösningar och med reservation för att jag inte kan python bättre (finns antagligen snyggare python-lösning):

for l in l1: if l in l2: print "GG" break

Och om jag ska försöka efterlikna din egen metod:

if set([tuple(l) for l in l1]) & set([tuple(l) for l in l2]): print "GG"

skriver med korvfingrar
Permalänk
Hedersmedlem
Skrivet av PHOEW:

@madmaster32:
Problemet du upplever är att du inte kan ha ett set av listor. Detta eftersom ett element i ett set ska vara hashbart, eftersom en lista är ändringsbar (mutable) så går det inte att med säkerhet hasha.

Exactamundo! Det lyfter också frågan om huruvida valet att använda en lista för de inre elementen är vettigt. Troligen borde det varit en tuple, då det verkar vara någon form av koordinat (kanske än hellre en namedtuple, om man vill finlira) där varje element har en specifik betydelse. Hade de varit tuplar så hade set(l1) & set(l2) fungerat direkt.

Det är också oklart om en lista är rätt datastruktur att samla dessa tuplar i till att börja med. Är ordningen relevant? Kan samma element förekomma multipla gånger, och har det i så fall någon mening? Om inte: använd ett set från första början, så löser mycket av problemet sig självt.

Sammanfattat så kanske ett set av tuplar vore mer passande än en lista av listor här.

När jag ändå är på tråden:

Skrivet av PHOEW:

if set([tuple(l) for l in l1]) & set([tuple(l) for l in l2]): print "GG"

Man kan spara några hakparenteser och skriva:

if set(tuple(l) for l in l1) & set(tuple(l) for l in l2): print("GG") # ← Nu är vi Python 3-kompatibla! :-)

Argumenten blir nu (förutom aningens mer lättlästa) snarare generator expressions med "lat uppbyggnad", vilket ibland är oumbärligt mycket bättre, och åtminstone inte sämre.

Ser man en liknande konvertering i kod så är det dock en stor blinkande neonskylt som varnar om att något i designen troligen inte är så smidigt som det skulle kunna vara. Av de fragment vi ser här så misstänker jag starkt åtminstone att de inre listorna borde vara tuplar.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Skrivet av phz:

Exactamundo! Det lyfter också frågan om huruvida valet att använda en lista för de inre elementen är vettigt. Troligen borde det varit en tuple, då det verkar vara någon form av koordinat (kanske än hellre en namedtuple, om man vill finlira) där varje element har en specifik betydelse. Hade de varit tuplar så hade set(l1) & set(l2) fungerat direkt.

Det är också oklart om en lista är rätt datastruktur att samla dessa tuplar i till att börja med. Är ordningen relevant? Kan samma element förekomma multipla gånger, och har det i så fall någon mening? Om inte: använd ett set från första början, så löser mycket av problemet sig självt.

Sammanfattat så kanske ett set av tuplar vore mer passande än en lista av listor här.

När jag ändå är på tråden:
Man kan spara några hakparenteser och skriva:

if set(tuple(l) for l in l1) & set(tuple(l) for l in l2): print("GG") # ← Nu är vi Python 3-kompatibla! :-)

Argumenten blir nu (förutom aningens mer lättlästa) snarare generator expressions med "lat uppbyggnad", vilket ibland är oumbärligt mycket bättre, och åtminstone inte sämre.

Ser man en liknande konvertering i kod så är det dock en stor blinkande neonskylt som varnar om att något i designen troligen inte är så smidigt som det skulle kunna vara. Av de fragment vi ser här så misstänker jag starkt åtminstone att de inre listorna borde vara tuplar.

Tackar. Håller själv på att lära mig python. Så all info är välkommet

Skickades från m.sweclockers.com