Comments on: S’affranchir des doublons d’un itérable en Python http://sametmax.com/saffranchir-des-doublons-dun-iterable-en-python/ Deux développeurs en vadrouille qui se sortent les doigts du code Wed, 05 Feb 2014 12:15:31 +0000 hourly 1 http://wordpress.org/?v=3.3.1 By: Sam http://sametmax.com/saffranchir-des-doublons-dun-iterable-en-python/#comment-14453 Sam Tue, 01 Oct 2013 13:28:15 +0000 http://sametmax.com/?p=7143#comment-14453 Hello @JeromeJ. Cette solution ne fonctionne malheureusement qu'avec les itérables de taille finie et occupe pas mal de mémoire du fait des clés inutiles du dico. De plus on perd le bénéfice du travail au fur et à mesure d'un générateur. Hello @JeromeJ.

Cette solution ne fonctionne malheureusement qu’avec les itérables de taille finie et occupe pas mal de mémoire du fait des clés inutiles du dico. De plus on perd le bénéfice du travail au fur et à mesure d’un générateur.

]]>
By: JeromeJ http://sametmax.com/saffranchir-des-doublons-dun-iterable-en-python/#comment-13896 JeromeJ Wed, 04 Sep 2013 02:03:47 +0000 http://sametmax.com/?p=7143#comment-13896 Supprime les doublons et conserve l'ordre : <code>import collections import itertools print(list(OrderedDict(itertools.zip_longest("abcddde", (None,))).keys())) # ['a', 'b', 'c', 'd', 'e'] print(list(OrderedDict(itertools.zip_longest((1,2,2,2,3), (None,))).keys())) # [1, 2, 3] </code> Sûrement améliorable. Genre créer une fonction et s'assurer de renvoyer le même type que celui reçu ? zip_longest n'est ptet pas requis non plus si on reçoit l'input via un paramètre (None,)*len(myInput) mais j'ignore si ça serait plus rapide. Supprime les doublons et conserve l’ordre :

import collections
import itertools

print(list(OrderedDict(itertools.zip_longest("abcddde", (None,))).keys())) # ['a', 'b', 'c', 'd', 'e']

print(list(OrderedDict(itertools.zip_longest((1,2,2,2,3), (None,))).keys())) # [1, 2, 3]

Sûrement améliorable.

Genre créer une fonction et s’assurer de renvoyer le même type que celui reçu ?
zip_longest n’est ptet pas requis non plus si on reçoit l’input via un paramètre (None,)*len(myInput) mais j’ignore si ça serait plus rapide.

]]>
By: Sam http://sametmax.com/saffranchir-des-doublons-dun-iterable-en-python/#comment-13485 Sam Tue, 20 Aug 2013 20:14:55 +0000 http://sametmax.com/?p=7143#comment-13485 J'ai oublié de traiter le cas où les données sont ordonnées et les doublons contigus, c'est encore un autre algo... J’ai oublié de traiter le cas où les données sont ordonnées et les doublons contigus, c’est encore un autre algo…

]]>
By: Sam http://sametmax.com/saffranchir-des-doublons-dun-iterable-en-python/#comment-13484 Sam Tue, 20 Aug 2013 20:10:46 +0000 http://sametmax.com/?p=7143#comment-13484 Merci pour la correction Xavier. En fait wordpress escape les tags HTML en remplaçant tout < et >, sans se soucier de si c'est dans un tag ou pas. Merci pour la correction Xavier.

En fait wordpress escape les tags HTML en remplaçant tout < et >, sans se soucier de si c’est dans un tag ou pas.

]]>
By: Xavier Combelle http://sametmax.com/saffranchir-des-doublons-dun-iterable-en-python/#comment-13481 Xavier Combelle Tue, 20 Aug 2013 19:38:18 +0000 http://sametmax.com/?p=7143#comment-13481 J'ai merdu le commentaire précédent vous pouvez le supprimer il s'agissait simplement de générer une liste avec peu ou pas (dans le cas tester de membre dupliqué <pre lang="python"> import random;lst = list(random.random()for i in range (2600)) </pre> Car le pire case et celui ou on ne trouve pas de membre dupliqué dans ce cas le skip_duplicate est le plus performant c’est de l’O(n) contre de l’O(n^2) pour remove_duplicate J’ai merdu le commentaire précédent vous pouvez le supprimer

il s’agissait simplement de générer une liste avec peu ou pas (dans le cas tester de membre dupliqué

import random;lst = list(random.random()for i in range (2600))

Car

le pire case et celui ou on ne trouve pas de membre dupliqué dans ce cas le skip_duplicate est le plus performant c’est de l’O(n) contre de l’O(n^2) pour remove_duplicate

]]>
By: Xavier Combelle http://sametmax.com/saffranchir-des-doublons-dun-iterable-en-python/#comment-13480 Xavier Combelle Tue, 20 Aug 2013 19:28:42 +0000 http://sametmax.com/?p=7143#comment-13480 euh le worst case et celui ou on ne trouve pas de duplicate dans ce cas le skip_duplicate est le plus performant c'est de l'O(n) contre de l'O(n^2) <pre lang="python"> >>> setup = """ ... def skip_duplicates(iterable, key=lambda x: x): ... fingerprints = set() ... for x in iterable: ... fingerprint = key(x) ... if fingerprint not in fingerprints: ... yield x ... fingerprints.add(fingerprint) ... import random;lst = list(random.random()for i in range (2600))""" >>> timeit.timeit('list(skip_duplicates(lst))', setup=setup, number=1000) 1.4679905869998038 >>> setup = """ ... def remove_duplicates(lst, equals=lambda x, y: x == y): ... if not isinstance(lst, list): ... raise TypeError('This function works only with lists.') ... i1 = 0 ... l = (len(lst) - 1) ... while i1 < l: ... elem = lst[i1] ... i2 = i1 + 1 ... while i2 >> timeit.timeit('list(remove_duplicates(lst))', setup=setup, number=1000) ^CTraceback (most recent call last): File "", line 1, in File "/usr/lib/python3.3/timeit.py", line 225, in timeit return Timer(stmt, setup, timer).timeit(number) File "/usr/lib/python3.3/timeit.py", line 190, in timeit timing = self.inner(it, self.timer) File "", line 22, in inner File "", line 12, in remove_duplicates KeyboardInterrupt J'ai pas eu la patience d'attendre >>> timeit.timeit('list(remove_duplicates(lst))', setup=setup, number=10) 10.55606729000283 </pre> soit un facteur environ 1000 PS:mais pourquoi wordpress garde pas les caractère du code intacts ? euh

le worst case et celui ou on ne trouve pas de duplicate dans ce cas le skip_duplicate est le plus performant c’est de l’O(n) contre de l’O(n^2)

>>> setup = """
... def skip_duplicates(iterable, key=lambda x: x):
...         fingerprints = set()
...         for x in iterable:
...                 fingerprint = key(x)
...                 if fingerprint not in fingerprints:
...                         yield x
...                         fingerprints.add(fingerprint)
... import random;lst = list(random.random()for i in range (2600))"""
>>> timeit.timeit('list(skip_duplicates(lst))', setup=setup, number=1000)
1.4679905869998038
 
 
>>> setup = """
... def remove_duplicates(lst, equals=lambda x, y: x == y):
...     if not isinstance(lst, list):
...         raise TypeError('This function works only with lists.')
...     i1 = 0
...     l = (len(lst) - 1)
...     while i1 &lt; l:
...         elem = lst[i1]
...         i2 = i1 + 1
...         while i2 >> timeit.timeit('list(remove_duplicates(lst))', setup=setup, number=1000)
^CTraceback (most recent call last):
  File "", line 1, in 
  File "/usr/lib/python3.3/timeit.py", line 225, in timeit
    return Timer(stmt, setup, timer).timeit(number)
  File "/usr/lib/python3.3/timeit.py", line 190, in timeit
    timing = self.inner(it, self.timer)
  File "", line 22, in inner
  File "", line 12, in remove_duplicates
KeyboardInterrupt
 
J'ai pas eu la patience d'attendre
 
>>> timeit.timeit('list(remove_duplicates(lst))', setup=setup, number=10)
10.55606729000283

soit un facteur environ 1000

PS:mais pourquoi wordpress garde pas les caractère du code intacts ?

]]>
By: roro http://sametmax.com/saffranchir-des-doublons-dun-iterable-en-python/#comment-13473 roro Tue, 20 Aug 2013 10:49:27 +0000 http://sametmax.com/?p=7143#comment-13473 Diablement intéressant ! Et ça nous change un peu de tes p...n de manip "Web". Donc: Thank you véry much...Master ! Diablement intéressant ! Et ça nous change un peu de tes p…n de manip “Web”.
Donc: Thank you véry much…Master !

]]>