题
我有此列表:
names = ['john','Jonh','james','James','Jardel']
我想在列表上循环,并在相同的迭代中处理带有案例不敏感的匹配的连续名称。因此,在第一次迭代中,我会用“约翰”和“约翰”做点事,我希望下一个迭代从“詹姆斯”开始。
我想不出一种使用Python's进行循环的方法,有什么建议吗?
解决方案
这是一个 itertools.groupby
, ,哪些分组来自列表或其他峰值的连续平等元素。您可以指定进行比较的函数,以便在您的情况下,在不同情况下,相同的名称仍然可以被视为同一件事。
for k, g in itertools.groupby(names, lambda s: s.lower()):
# Example: in the first iteration:
# k = "john"
# g = an iterator over ["john", "John"]
# Process them as you like
其他提示
names = ['john','John','james','James']
for name, capitalized_name in zip(names[::2], names[1::2]):
print name, capitalized_name
请注意,您需要均匀的项目才能正常工作。
或(也许更好;在几乎没有上下文的情况下很难说出)使用 set
要过滤列表以仅包含唯一名称(请注意,丢失顺序):
>>> names = ['john','John','james','James','Jardel']
>>> unique_names = set([x.lower() for x in names])
>>> for unique_name in unique_names:
... print unique_name
...
jardel
james
john
你可以只使用 while
环形:
i = 0
while i < len(names):
# compare names[i] with names[i + 1]
i = i + 2 # or + 1 if names not equal, for example
还是您正在寻找更多参与的东西?
当您迭代循环时,您可以尝试跟踪列表中的先前名称。同时,当您要存储名称时,您可以调用lower()或Capitalize()以使每个名称的格式保持一致,以便您可以更轻松地比较它们。
例如
first = True
prev= ""
for name in names:
if first: #First iteration
prev = name.lower() #Need to get the first elem
do_something_to(curr)
first = False
else:
if prev == name.lower():
print "do nothing"
else:
do_something_to(curr)
prev = name.lower()
可能不是最有效的,而是起作用。
我的$ 0.02:
def byPairs(li):
for i in xrange(1, len(li), 2):
yield (li[i-1], li[i])
for a,b in byPairs(names):
if a.lower()==b.lower():
doSomething(a,b)
我不确定我准确地理解了这个问题。你想达到什么目的?
不隶属于 StackOverflow