Seite 1 von 1

Abgleich von Listen mit unterschiedlichem Inhalt

Verfasst: Donnerstag 20. Oktober 2016, 21:57
von pixewakb
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]

Re: Abgleich von Listen mit unterschiedlichem Inhalt

Verfasst: Donnerstag 20. Oktober 2016, 22:15
von darktrym
Sieht doch stark nach difflib Funkionalität aus.

Re: Abgleich von Listen mit unterschiedlichem Inhalt

Verfasst: Donnerstag 20. Oktober 2016, 22:16
von pixewakb
Danke, schaue ich mir gleich mal an. Ich hatte itertools auf dem Schirm, dort aber nichts gefunden!

Re: Abgleich von Listen mit unterschiedlichem Inhalt

Verfasst: Donnerstag 20. Oktober 2016, 23:11
von 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()