2011-07-14 2 views

Répondre

4
strings = ['this', 'this', 'and', 'that'] 
for a, b in zip(strings, strings[1:]): 
    if a == b: 
     print a 
+0

Ceci copie la liste (bien, sauf son premier élément) cependant inutile. – delnan

+0

Optimisez si nécessaire. – FogleBird

+0

Je ne suis même pas sûr si son plus lisible/élégant qu'une simple boucle à travers tous les éléments ... – MartinStettner

6
s = ["this", "this", "and", "that"] 
for i in xrange(1,len(s)): 
    if s[i] == s[i-1]: 
     print s[i] 

EDIT:

Tout comme une note de côté, si vous utilisez l'utilisation 3.X python range au lieu de xrange

1
TEST = ["this", "this", "and", "that"] 
for i, s in enumerate(TEST): 
    if i > 0 and TEST[i-1] == s: 
     print s 

# Prints "this" 
2

La plupart Pythonic est un list comprehension, qui est exactement construit pour faire une boucle et tester en même temps:

>>> strings = ['this', 'this', 'and', 'that'] 

>>> [a for (a,b) in zip(strings, strings[1:]) if a==b] 

['this'] 

Ou, pour éviter des objets temporaires (h/t @ 9000):

>>> import itertools as it 
>>> [a for (a,b) in it.izip(strings, it.islice(strings,1)) if a==b] 

['this'] 
2

Parfois, j'aiment coller avec des boucles à l'ancienne:

strings = ['this', 'this', 'and', 'that'] 
for i in range(0, len(strings)-1): 
    if strings[i] == strings[i+1]: 
     print strings[i] 

Tout le monde sait ce qui se passe sans trop penser, et c'est assez efficace ...

0

Est-ce que ce sont les devoirs?

l = ["this", "this", "and", "that", "foo", "bar", "bar", "baz"] 

for i in xrange(len(l)-1): 
    try: 
     if l.index(l[i], i+1) == i+1: 
     print l[i] 
    except ValueError: 
     pass 
+0

Je ne vois vraiment pas pourquoi vous utilisez l'instruction try/except? Je vais simplement utiliser une impression str (l [i]) et ça va aller :) – ykatchou

+0

list.index() lève une exception ValueError si l'élément est introuvable. C'est pourquoi. – BjoernD

+0

le seul moyen de le faire est de supprimer un élément entre la plage et l'impression? :/ – ykatchou

0

D'une manière générale, si vous traitez sur les éléments dans une liste et vous devez regarder le de courant poste voisins, vous allez vouloir utiliser enumerate, puisque enumerate vous donne à la fois l'élément en cours et sa position dans la liste.

Contrairement aux approches qui utilisent zip, cette compréhension de la liste ne nécessite pas de duplication de la liste:

print [s for i, s in enumerate(test[:-1]) if s == test[i + 1]] 

Notez qu'il échoue s'il n'y a pas au moins deux éléments en test, et que test doit être liste. (Les approches zip fonctionneront sur n'importe quel itérable.)

0

Voici une approche légèrement différente qui utilise une classe spéciale pour détecter les répétitions dans une séquence. Ensuite, vous pouvez réellement trouver les répétitions en utilisant une simple compréhension de la liste.

class repeat_detector(object): 
    def __init__(self, initial=None): 
     self.last = initial 
    def __call__(self, current): 
     if self.last == current: 
      return True 
     self.last = current 
     return False 

strings = ["this", "this", "and", "that"] 

is_repeat = repeat_detector() 

repeats = [item for item in strings if is_repeat(item)] 
0

Utilisez la recette pairwise() de la documentation stdlib itertools (je cite ici):

def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 

Et vous pouvez faire:

for a, b in pairwise(L): 
    if a == b: 
     print a 

Ou avec une expression de générateur jeté:

for i in (a for a, b in pairwise(L) if a==b): 
    print i 
1

pourquoi pas simplement?:

strings = ['this', 'this', 'and', 'that', 'or', 'or', 12,15,15,15, 'end'] 

a = strings[0] 
for x in strings: 
    if x==a: 
     print x 
    else: 
     a = x 
+0

Cela va toujours imprimer l'élément firth dans 'strings' depuis a et x les deux commencent comme des chaînes [0]. – istruble

Questions connexes