entrée:
Liste triée code>, comme ceci: [1,2,3,8,10,15,16,17,18,22,23,27,30,31] < / code> li>
- Un seuil, comme celui-ci:
max_diff = 2 code> li>
ul> Sortie attendue: p>
- une liste de sous-listes; Chaque sous-liste contient les valeurs que la différence voisine est plus petite que max_diff, comme celle-ci:
[[1, 2, 3], [8, 10], [15, 16, 17, 18], [22, 23 ], [27], [30, 31]] code> li>
ul> Voici comment je faisais cela, je me demande s'il y a une meilleure façon de le faire. p> xxx pré> p>
4 Réponses :
Vous pouvez utiliser énumérer code> et zip code> dans une liste de compréhension pour trouver les indices des éléments que la différence de valeur est supérieure à 2, puis divisez votre liste sur la base de l'index. Liste:
>>> a = [1,2,3,8,10,15,16,17,18,22,23,27,30,31] >>> b = a[1:] #offset by 1 position >>> b [2, 3, 8, 10, 15, 16, 17, 18, 22, 23, 27, 30, 31] >>> c = [(i[1] - i[0]) for i in zip(a[:-1], b)] >>> c #position diff [1, 1, 5, 2, 5, 1, 1, 1, 4, 1, 4, 3, 1] >>> d = [i[0] for i in enumerate(c) if i[1] > 2] >>> d #split position [2, 4, 8, 10, 11] >>> e = [-1]+d+[len(a)] >>> e #add start end to split position [-1, 2, 4, 8, 10, 11, 14] >>> [a[l[0]+1: l[1]+1] for l in zip(e, e[1:])] [[1, 2, 3], [8, 10], [15, 16, 17, 18], [22, 23], [27], [30, 31]] #split result
réorganiser vos lignes conduit à une forme plus compacte:
fonctionne sur tous les itérables
Pourquoi n'utilisez-vous pas de boucle?
Vous avez raison, cela ne m'a pas eu duré que je suis en train de construire une boucle.
Fondamentalement, la solution que j'allais poster et j'ai fini à peu près, mais j'étais tellement fatiguée que je n'ai pas complètement i> la finition: p.
Revue de code codereview.stackexchange.com
Si ce code fonctionne pleinement et que vous préférez améliorer-y, vous risquez peut-être mieux de poster sur Codereview comme suggéré à PRAVEEN. Mais assurez-vous de lire leur Comment demander à page.