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?
3 Réponses :
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)
Merci DeepSpace!
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 -
Exécutez chacune des fonctions NumPy encapsulées pour voir ce qui se passe.
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.
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
Je l'ai mentionné dans ma réponse.
value - 1 in my_lista une complexité temporelle O (n). Pensez à convertirmy_listen unsetpour le faire dans O (1).