Как сравнить строку со следующей строкой в ​​списке? - PullRequest
2 голосов
/ 14 июля 2011

Я пишу небольшой алгоритм НЛП, и мне нужно сделать следующее:

Для каждой строки x в списке ["this", "this", "and", "that"], если строка x и следующая строка идентичны, яхочу напечатать строку.

Ответы [ 10 ]

6 голосов
/ 14 июля 2011
s = ["this", "this", "and", "that"]
for i in xrange(1,len(s)):
    if s[i] == s[i-1]:
        print s[i]

EDIT:

Как примечание, если вы используете Python 3.X, используйте range вместо xrange

4 голосов
/ 14 июля 2011
strings = ['this', 'this', 'and', 'that']
for a, b in zip(strings, strings[1:]):
    if a == b:
        print a
2 голосов
/ 14 июля 2011

Иногда мне нравится придерживаться старомодных петель:

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

Все знают, что происходит, не задумываясь, и это довольно эффективно ...

2 голосов
/ 14 июля 2011

Большинство Pythonic - это список , который точно создан для циклического выполнения и тестирования одновременно:

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

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

['this']

Или, чтобы избежать временных объектов (h / t @ 9000):

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

['this']
1 голос
/ 15 июля 2011

почему не просто?:

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
1 голос
/ 14 июля 2011
TEST = ["this", "this", "and", "that"]
for i, s in enumerate(TEST):
   if i > 0 and TEST[i-1] == s:
      print s

# Prints "this"
0 голосов
/ 14 июля 2011

Используйте рецепт для pairwise() из документации по stdlib itertools (я приведу здесь):

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

И вы можете сделать:

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

Или с использованием выражения генератора:

for i in (a for a, b in pairwise(L) if a==b):
    print i
0 голосов
/ 14 июля 2011

Вот немного другой подход, который использует специальный класс для обнаружения повторов в последовательности.Тогда вы можете найти повторы, используя простое понимание списка.

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 голосов
/ 14 июля 2011

Вообще говоря, если вы обрабатываете элементы в списке и вам нужно посмотреть на соседей текущего элемента, вы захотите использовать enumerate, так как enumerate дает вам и текущий элемент, иего позиция в списке.

В отличие от подходов, использующих zip, это понимание списка не требует дублирования списка:

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

Обратите внимание, что произойдет сбой, если неткак минимум два элемента в test, и этот test должен быть списком.(Подходы zip будут работать на любой итерации.)

0 голосов
/ 14 июля 2011

Это домашняя работа?

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...