Indexzahlen gleicher Inhalte in Liste ausgeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MrOdin
User
Beiträge: 11
Registriert: Montag 13. August 2018, 11:28

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?
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
MrOdin
User
Beiträge: 11
Registriert: Montag 13. August 2018, 11:28

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
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

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))
MrOdin
User
Beiträge: 11
Registriert: Montag 13. August 2018, 11:28

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:
Antworten