6
votes

Comment diviser une liste triée en sous-listes lorsque deux différences de valeur voisines sont plus grandes qu'un seuil

entrée:

  • A Liste triée , comme ceci: [1,2,3,8,10,15,16,17,18,22,23,27,30,31] < / code>
  • Un seuil, comme celui-ci: max_diff = 2

    Sortie attendue:

    • 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]]

      Voici comment je faisais cela, je me demande s'il y a une meilleure façon de le faire. xxx


2 commentaires

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.


4 Réponses :


2
votes

Vous pouvez utiliser énumérer et zip 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: xxx


0 commentaires

0
votes
>>> 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

0 commentaires

0
votes

réorganiser vos lignes conduit à une forme plus compacte: xxx


0 commentaires

0
votes

fonctionne sur tous les itérables xxx


3 commentaires

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 la finition: p.