Abgleich von Listen mit unterschiedlichem Inhalt

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
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

2 Listen vergleichen und zwar der Form a = [1, 2, 4] und b = [2, 3, 4], woraus dann folgende Liste gebildet werden soll ergebnis = [ [1, "-"], [2, 2], ["-", 3], [4, 4]]. Die Input-Listen bekomme ich vorgegeben und sie haben die Form wie bei a und b. Ihre Anzahl kann variieren (hier mal mit 3), die Ausgabe(form) ist ebenfalls vorgegeben.

Gibt es dazu ein besseres Verfahren als folgendes (Abgleich-Liste abgleich bilden in dieser Form und darüber iterieren, um die Listen abzugleichen):

Code: Alles auswählen

a = [1, 2, 4]
b = [2, 3, 4]
c = [1, 2, 3]
listen = [a, b, c]

abgleich = list(set(a + b + c))
print(abgleich)
ausgabe = []

for item in abgleich:
    line = []
    for liste in listen:
        if item in liste:
            line.append(item)
        else:
            line.append("-")
    ausgabe.append(line)


# Folgende Ausgabe nur zu Testzwecken
print(" | ".join(["a", "b", "c"]), end="\n==========\n")
for line in ausgabe:
    print(" | ".join(map(str, line)))
Liefert in der Konsole:
[codebox=text file=Unbenannt.txt]a | b | c
==========
1 | - | 1
2 | 2 | 2
- | 3 | 3
4 | 4 | -[/code]
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Sieht doch stark nach difflib Funkionalität aus.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Danke, schaue ich mir gleich mal an. Ich hatte itertools auf dem Schirm, dort aber nichts gefunden!
BlackJack

Wie sähe das hier aus?

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
from collections import defaultdict


def main():
    a = [1, 2, 4]
    b = [2, 3, 4]
    c = [1, 2, 3]
    lists = [a, b, c]

    item2indices = defaultdict(list)

    for i, items in enumerate(lists):
        for item in items:
            item2indices[item].append(i)

    result = list()
    for item, indices in item2indices.iteritems():
        row = ['-'] * len(lists)
        for i in indices:
            row[i] = item
        result.append(row)

    print(result)


if __name__ == '__main__':
    main()
Antworten