Seite 1 von 1
Elemente einer Liste mit einer Toleranz vergleichen und dann gleiche Elemente ausgeben.
Verfasst: Dienstag 30. Juli 2019, 17:44
von rob29
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ß
Re: Elemente einer Liste mit einer Toleranz vergleichen und dann gleiche Elemente ausgeben.
Verfasst: Dienstag 30. Juli 2019, 17:48
von __deets__
Hast du Beispieldaten? Was geht rein, was soll rauskommen? Und was hast du schon probiert?
Re: Elemente einer Liste mit einer Toleranz vergleichen und dann gleiche Elemente ausgeben.
Verfasst: Dienstag 30. Juli 2019, 18:56
von Kirikkayis
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?
Re: Elemente einer Liste mit einer Toleranz vergleichen und dann gleiche Elemente ausgeben.
Verfasst: Dienstag 30. Juli 2019, 19:52
von rob29
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 !
Re: Elemente einer Liste mit einer Toleranz vergleichen und dann gleiche Elemente ausgeben.
Verfasst: Dienstag 30. Juli 2019, 20:01
von __deets__
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?
Re: Elemente einer Liste mit einer Toleranz vergleichen und dann gleiche Elemente ausgeben.
Verfasst: Dienstag 30. Juli 2019, 22:10
von rob29
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-
Re: Elemente einer Liste mit einer Toleranz vergleichen und dann gleiche Elemente ausgeben.
Verfasst: Dienstag 30. Juli 2019, 22:27
von __deets__
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.
Re: Elemente einer Liste mit einer Toleranz vergleichen und dann gleiche Elemente ausgeben.
Verfasst: Dienstag 30. Juli 2019, 22:59
von __blackjack__
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()