-1
votes

Rechercher si la valeur dans la liste a une valeur - 1 ou valeur + 1 dans la liste

J'ai une liste:

for value in set(my_list):  # Using set() to remove duplicates to speed up loop
    if not value - 1 in my_list and not value + 1 in my_list:
        print(value)

Je veux savoir quelles valeurs (ou combien d'entre elles) dans my_list qui n'ont pas de "nombres entiers voisins" dans la liste entière. Ce que j'ai imaginé, c'est cette vilaine boucle.

my_list = [8, 6, 2, 1, 9]

La sortie ici n'est que l'entier 6 car il n'y a pas de 5 ou 7 dans la liste.

Existe-t-il une solution plus élégante, qui pourrait aussi être plus rapide?


1 commentaires

value - 1 in my_list a une complexité temporelle O (n). Pensez à convertir my_list en un set pour le faire dans O (1).


3 Réponses :


2
votes

Votre solution est O (n ^ 2).

Vous étiez sur la bonne voie pour convertir la liste en un ensemble, mais vous n'avez pas tiré pleinement parti de l'ensemble créé (recherche O (1)).

C'est O (n):

data_set = set(my_list)
for value in data_set:
    if value - 1 not in data_set and value + 1 not in data_set:
        print(value)


1 commentaires

Merci DeepSpace!



0
votes

Une méthode de compréhension de liste pour ce faire (cette méthode devrait être la plus rapide parmi les réponses) -

array([ 6, 11, 15, 33])
import numpy as np
my_list = np.array([8, 6, 2, 1, 9, 11, 15, 33, 21, 22])

my_list[np.all(np.abs(my_list[:,None] - my_list)!=1, axis=1)]


Une autre méthode: voici quelque chose que vous pouvez faire en utilisant NumPy de manière vectorisée.

[ 6, 11, 15, 33]
mylist = set(my_list)

[i for i in my_list if i-1 not in my_list and i+1 not in my_list]

Expliquer -

  1. Vous calculez d'abord la différence absolue entre tous les éléments de la liste et elle-même en utilisant les capacités de diffusion de numpy. Fondamentalement, vous obtenez une matrice de différence par paire ici.
  2. Vous trouvez laquelle des lignes a une valeur == 1 et ignorez ces lignes. Ce sont les lignes qui ont au moins un autre élément où différence == 1 (voisins)
  3. Vous indexez simplement le tableau d'origine booléen.

Exécutez chacune des fonctions NumPy encapsulées pour voir ce qui se passe.


2 commentaires

Merci, je vais essayer et voir si ça va mieux! :)


C'était en fait le même ou même un peu plus lent que ma boucle for originale. C'est peut-être parce que ma liste est au maximum de 8 éléments, et que je dois utiliser len (list_comprehension). Mais, puisque c'est une belle solution que j'aime, j'accepterai cette réponse.



-1
votes

C'est une solution un peu longue

def n(l):
neighbours = []
for i, v in enumerate(l):
    for v1 in l[i+1:]:
        if abs(v1-v) == 1:
            if v not in neighbours:
                neighbours.append(v)
            if v1 not in neighbours:
                neighbours.append(v1)
return neighbours


1 commentaires

Je l'ai mentionné dans ma réponse.