Elemente einer Liste mit einer Toleranz vergleichen und dann gleiche Elemente 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
rob29
User
Beiträge: 3
Registriert: Dienstag 30. Juli 2019, 17:30

Hallo zusammen,

Ich stehe vor folgendem Problem:

Ich habe eine Liste mit 2er Tupel.

Ich würde gerne jeweils das erste Elemente von jedem Tupel miteinander vergleichen. Falls es sich um die gleichen Elemente handelt bzw. die Elemente nur um +/-1 abweichen soll ein neuer Tupel mit den jeweils gleichen( +/- 1) Elementen in einer Liste erstellt werden. Wichtig wäre das auch im Falle von 3 oder mehr mal das gleiche Element nur ein Tupel erstellt wird.

Vielen Dank im Voraus!

Gruß
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du Beispieldaten? Was geht rein, was soll rauskommen? Und was hast du schon probiert?
Kirikkayis
User
Beiträge: 85
Registriert: Freitag 18. Januar 2019, 08:02

Hey,

was heißt "... von jedem Tupel miteinander vergleichen." ?

Du möchtest das erste Element des ersten Tupel mit dem ersten Element des zweiten Tupel vergleichen? Habe ich das richtig verstanden?
rob29
User
Beiträge: 3
Registriert: Dienstag 30. Juli 2019, 17:30

Ja also nehmen wir an ich habe die einzelnen Tupel in der Liste:
[(2, Test1) (5, Test2) (2.5, Test3) (5, Test4) (8, Test9)

jetzt sollen die Zahlen alle miteinander verglichen werden.
Also 2 mit 5...

Wenn es zwei gleiche Zahlen (bzw. +/- 1 unterschied) dann sollen diese zusammen in einem Tupel o.ä. ausgegeben werden. Allerdings das 2. Element der Zahlen.

Hier im Beispiel dann:

[ (Test1, Test3) (Test2, Test4)]

Das ganze dann eben nur mit wesentlich mehr 2er Tupel in der Ausgangsliste

Danke schonmal !
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und was passiert wenn da mehrere nah Beieinander sind? Wird das dann ein längeres Tupel?

oder zb eine ganze Folge von Zahlen von 1-5 drin ist? Dann ist 1 nah an 2 ist nah an 3 ist nah an 4 ist nah an 5, und du endest mit allen werten in einem Tupel. Ist das ok?
rob29
User
Beiträge: 3
Registriert: Dienstag 30. Juli 2019, 17:30

Ja also es kann dann ruhig ein längerer Tupel werden.
Und das mit der Zahlenfolge geht auch da in meinem Fall solche Abfolgen sehr unwahrscheinlich sind-
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na dann. Sortier deine Liste. Merk dir den ersten wert, und pack die erste payload in ein Tupel. Iteriere über die restlichen Elemente, und solange die aktuelle Zahl nah genug dran ist, pack die payload zum Tupel dazu. Und Merk dir die aktuelle zahl. Wenn der Abstand zu groß ist, stattdessen gemerktes Tupel in eine Liste & aktuelle payload wieder in das Merk-Tupel.
Benutzeravatar
__blackjack__
User
Beiträge: 14045
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Nahezu ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from itertools import count, groupby
from operator import itemgetter

from more_itertools import pairwise, prepend


def convert_score_to_group_index(data):
    counter = count()
    group_index = next(counter)
    for (score_a, _), (score_b, value_b) in pairwise(
        prepend(data[0], sorted(data))
    ):
        if abs(score_b - score_a) > 1:
            group_index = next(counter)
        yield (group_index, value_b)


def process(data):
    for _, group in groupby(convert_score_to_group_index(data), itemgetter(0)):
        result = list(map(itemgetter(1), group))
        if len(result) > 1:
            yield result


def main():
    data = [
        (2, 'Test1'), (5, 'Test2'), (2.5, 'Test3'), (5, 'Test4'), (8, 'Test9')
    ]
    print(list(process(data)))


if __name__ == '__main__':
    main()
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten