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ß
Elemente einer Liste mit einer Toleranz vergleichen und dann gleiche Elemente ausgeben.
-
- 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?
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?
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 !
[(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 !
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?
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?
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.
- __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.