我正在编写一个小型NLP算法,我需要执行以下操作:
对于列表["this", "this", "and", "that"]
中的每个字符串x,如果字符串x
和下一个字符串相同,我想打印字符串。
答案 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