2017-11-20 27 views
0

ich eine Liste von Listen haben:Operationen auf Unterlisten in der Liste

a = [[1, 2], [2, 3], [4, 3]] 

Wie die folgende Wirkung in zwei Schritten kommt man hin:

  1. b = [[1, 2, 2, 3], [1, 2, 4, 3], [2, 3, 4, 3]]
  2. b = [[1, 2, 3], [1, 2, 4, 3]], es bedeutet, :

    1.1. Treten in der Unterliste b[i] nebeneinander die gleichen Werte auf, dann muss einer dieser Werte gelöscht werden, .

    2.2. Wenn die gleichen Werte in einer bestimmten Unterliste b[i] aber nicht neben jeder anderen erscheinen, dann muss die gesamte Unterliste b[i] gelöscht werden.

+0

Was Sie selbst versucht? – schwobaseggl

+1

Sie haben eine Menge Fragen gestellt, also bin ich ein bisschen besorgt. Vielleicht sollten Sie einen Schritt zurücktreten und Ihre Lösung neu bewerten. Ich bekomme ein [XY-Problem] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) Vibes hier ... stelle sicher, dass dies der einzige/beste Weg ist was du versuchst zu tun. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ Vielleicht ändere ich zu oft das Konzept., Aber ich bin ein bisschen sauer auf dieses Projekt heh :) Aber ich denke, dass dieser Weg gut sein wird, weil ich nicht alle Kombinationen zwischen den Unterlisten bekommen konnte . –

Antwort

1

timegb ist richtig. Eine elegante Lösung beinhaltet eine gewisse Menge an Betrug und Täuschung. Ich werde versuchen, die Schritte zu brechen.

  • finden Sie alle 2-Kombinationen Ihre Eingabe mit itertools.combinations
  • zurück Kombinationen abflachen mit map und chain
  • für jede Kombination, Gruppe von aufeinanderfolgenden Elementen
  • nur diejenigen halten, die Ihre Bedingung erfüllen, indem ein tun Längenprüfung
from itertools import chain, combinations, groupby 

out = [] 
for r in map(lambda x: list(chain.from_iterable(x)), combinations(a, 2)): 
    j = [i for i, _ in groupby(r)] 
    if len(j) <= len(set(r)): 
     out.append(j) 
print(out) 
[[1, 2, 3], [1, 2, 4, 3]] 

Wenn Sie nur den ersten Teil benötigen, nur Kombinationen finden und abflachen:

out = list(map(lambda x: list(chain.from_iterable(x)), combinations(a, 2))) 

print(out) 
[[1, 2, 2, 3], [1, 2, 4, 3], [2, 3, 4, 3]] 
+0

Ich habe es aus den 'itertools()' oder 'product()' versucht, aber es hat das vermisst. Danke noch einmal! du schläfst wahrscheinlich nie :) –

+0

@TomaszPrzemski, hah! Schlaf? Was ist das? ;) –

+0

ein wenig Kaffee und weiterleiten :)) –

Verwandte Themen