Seite 1 von 1

Indexzahlen gleicher Inhalte in Liste ausgeben

Verfasst: Montag 24. September 2018, 15:35
von MrOdin
Ich habe (mal wieder) ein Problem:

Ich habe die Liste display (das sind keine booleans sondern tkinter-IntVars die die werte 150 oder 335 annehmen)

Code: Alles auswählen

    clm0=[0, 0, 0, 0, 0, 0, 0, 0]
    clm1=[0, 0, 0, 0, 0, 0, 0, 0]
    clm2=[0, 0, 0, 0, 0, 0, 0, 0]
    clm3=[0, 0, 0, 0, 0, 0, 0, 0]
    clm4=[0, 0, 0, 0, 0, 0, 0, 0]
    clm5=[0, 0, 0, 0, 0, 0, 0, 0]
    clm6=[0, 0, 0, 0, 0, 0, 0, 0]
    clm7=[0, 0, 0, 0, 0, 0, 0, 0]
    
    display=[clm0, clm1, clm2, clm3, clm4, clm5, clm6, clm7]
nun will ich die einzelnen Spalten (clm) mit einander vergleichen und die Indexzahlen übereinstimmender Werte in einer weiteren Liste Speichern: Etwa so:
[[0 ,2][1][3 ,4 ,5][6][7]]
display währe entsprechend:

Code: Alles auswählen

   
    clm0=[0, 0, 0, 0, 0, 0, 0, 0]
    clm1=[0, 0, 0, 0, 1, 0, 0, 0]
    clm2=[0, 0, 0, 0, 0, 0, 0, 0]
    clm3=[0, 0, 1, 0, 0, 1, 0, 0]
    clm4=[0, 0, 1, 0, 0, 1, 0, 0]
    clm5=[0, 0, 1, 0, 0, 1, 0, 0]
    clm6=[1, 1, 1, 1,  1, 1, 1, 1]
    clm7=[0, 1, 0, 1, 0, 1, 0, 1]
Ich habe mir folgenden Code überlegt:

Code: Alles auswählen

def preprocessing():
    
    global display
    global display_new
    display_new=[]
    display_copy=display
    countclm=0
    print("preprocessing")
    print(len(display))
    while countclm<len(display):
        clm_new=[]
        clm_storage=display[countclm]
        while True:
            
           
            try:
                print("preprocessing")
                
                
                
                clm_new.append(display_copy.index(clm_storage, countclm))
                print(clm_new)
                display_copy[display_copy.index(clm_storage, countclm)].append(countclm)
                
                
                
            except:
                display_new.append(clm_new)
                break
                
    	countclm=countclm+1
    print(display_new)
    
        
(ja ich weiß das global-Variablen böse sind, aber wenn ich sie übergebe lande ich in einen Paradox aus vor-Definierungen)
wenn ich dieses Programm jetzt allerdings ausführe stürzt es ab (ich nutze einen Raspi, aber ich denke nicht das es daran liegt). Wenn ich es mit den Taskmanager beende, steht unten das clm_new etwa so aussieht: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]. Allerdings sollte doch jedes mal countclm ans Ende der "clm" hinzugefügt werden, so das sie nicht mehr identisch zu clm_storage ist. Versuche ich da Äpfel mit Birnen zu vergleichen oder was mache ich falsch?

Re: Indexzahlen gleicher Inhalte in Liste ausgeben

Verfasst: Montag 24. September 2018, 16:20
von Sirius3
Ich werde aus Deiner Erklärung was Du erreichen willst, nicht schlau.
Funktionen bekommen alles, was sie brauchen, über ihre Argumente und geben Ergebnisse als Rückgabewerte zurück. An der Stelle, wo Du preprocessing aufrufst, solltest Du daher kein Paradox bekommen.
`display_copy` ist ein falscher Name, weil keine Kopie erzeugt wird.
Die äußere Schleife sollte eine for-Schleife sein, über Listen iteriert man direkt.
Die innere Schleife verstehe ich nicht. Nackte excepts niemals benutzen. Was für eine Exception erwartest Du denn und wann sollte die Schleife denn beendet werden?

Re: Indexzahlen gleicher Inhalte in Liste ausgeben

Verfasst: Montag 24. September 2018, 20:33
von MrOdin
Der Sinn der Funktion ist folgender:
Ich habe die (wie oben beschrieben aufgebaute) Liste Display welche tkinter-IntVars beinhaltet. Nun möchte ich einfach in einer weiteren Liste die Positionen gleicher „clms“ haben. Der Sinn dahinter ist, das ich mit den Werten der clms Servos steuere. Da dies etwas länger dauert will ich Kombinationen die mehrmals auftreten gleichzeitig ausführen. (nein, es ist nicht so einfach das ich doppelte Werte einfach lösche, allerdings kann ich die „Hardware“ nicht so einfach erklären). Die „while-True“-Schleife soll versuchen gleiche Werte zu finden und diese in die Liste „clm_new“ (der Name ist nicht ganz passend) hinzufügen. Wenn dies nicht klappt fügt er die Liste in die Liste Display_new (ich muss echt lernen mit passende Namen auszudenken) ein und verlässt die true-Schleife

Re: Indexzahlen gleicher Inhalte in Liste ausgeben

Verfasst: Montag 24. September 2018, 20:44
von __blackjack__
@MrOdin: Das sieht mir nach einer ``for``-Schleife mit `enumerate()` über die `display()` aus bei dem ein `collections.defaultdict` mit einer Abbildung von Tupel mit den Integerwerten auf eine Liste mit Indexwerten (aus dem `enumerate()`) erstellt wird.

Re: Indexzahlen gleicher Inhalte in Liste ausgeben

Verfasst: Montag 24. September 2018, 20:53
von Sirius3
Was Dein Code macht, habe ich immer noch nicht verstanden, was `clm` für eine kryptische Abkürzung ist, auch nicht.

Die Lösung zu Deinem Problem ist aber viel einfacher:

Code: Alles auswählen

from collections import defaultdict
displays = [
    [0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 1, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 1, 0, 0, 1, 0, 0],
    [0, 0, 1, 0, 0, 1, 0, 0],
    [0, 0, 1, 0, 0, 1, 0, 0],
    [1, 1, 1, 1, 1, 1, 1, 1],
    [0, 1, 0, 1, 0, 1, 0, 1],
]

indices = defaultdict(list)
for index, line in enumerate(displays):
    indices[tuple(line)].append(index)

Re: Indexzahlen gleicher Inhalte in Liste ausgeben

Verfasst: Montag 24. September 2018, 21:00
von __deets__
Deine Begründungen zu globalen Variablen sind nicht schlüssig. Es gibt überhaupt keinen Grund, die Funktion nicht einfach mit der Matrix aus werten zu füttern. Und wenn du deine Variablen gleich columns genannt hättest, statt eine komische Abkürzung zu nutzen, hätte das auch gleich mehr Klarheit geschafft.

Zu deinem Problem: unter der Annahme, das du schon eine Matrix aus Werten hast (IntVars sind nicht vergleichbar denke ich) sollte das hier funktionieren:

Code: Alles auswählen

from itertools import groupby

data = [[0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 1, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 1, 0, 0, 1, 0, 0],
    [0, 0, 1, 0, 0, 1, 0, 0],
    [0, 0, 1, 0, 0, 1, 0, 0],
    [1, 1, 1, 1,  1, 1, 1, 1],
    [0, 1, 0, 1, 0, 1, 0, 1]]

second=lambda v : v[1]

for k, group in groupby(sorted(enumerate(data), key=second), second):
    print(list(index for index, _ in group))

Re: Indexzahlen gleicher Inhalte in Liste ausgeben

Verfasst: Mittwoch 26. September 2018, 15:37
von MrOdin
Danke, ich muss wirklich mal öfter nach Modulen suchen, die sind echt hilfreich, jetzt muss ich nur noch versuchen diese Daten gescheit auf die Servos zu übertreiben, aber das versuche ich erstmal allein :lol: :) :mrgreen: