如何将字符串与列表中的下一个字符串进行比较?

时间:2011-07-14 16:59:05

标签: python string list compare next

我正在编写一个小型NLP算法,我需要执行以下操作:

对于列表["this", "this", "and", "that"]中的每个字符串x,如果字符串x和下一个字符串相同,我想打印字符串。

10 个答案:

答案 0 :(得分:6)

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

编辑:

正如旁注,如果您使用的是python 3.X,请使用range代替xrange

答案 1 :(得分:4)

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

答案 2 :(得分:2)

大部分Pythonic都是list comprehension,它完全是为了同时进行循环和测试而构建的:

>>> 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']

答案 3 :(得分:2)

有时,我喜欢坚持老式的循环:

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

每个人都在不经过深思熟虑的情况下知道发生了什么,而且效率相当高......

答案 4 :(得分:1)

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

# Prints "this"

答案 5 :(得分:1)

为什么不简单? :

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

答案 6 :(得分:0)

那是家庭作业吗?

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

答案 7 :(得分:0)

一般来说,如果您正在处理列表中的项目并且需要查看当前项目的邻居,那么您将需要使用enumerate,因为enumerate为您提供当前项目及其在列表中的位置。

与使用zip的方法不同,此列表理解不需要重复列表:

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

请注意,如果test中至少有两个元素,并且test必须是列表,则会失败。 (zip方法适用于任何可迭代的方法。)

答案 8 :(得分:0)

这是一种稍微不同的方法,它使用特殊类来检测序列中的重复。然后你可以使用简单的列表理解来实际找到重复。

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)]

答案 9 :(得分:0)

使用stdlib itertools文档中pairwise()的配方(我在这里引用):

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