1

我有这个清单:

names = ['john','Jonh','james','James','Jardel']

我想遍历列表并在同一迭代中处理不区分大小写的连续名称。所以在第一次迭代中,我会用“john”和“John”做一些事情,我希望下一次迭代从“james”开始。

我想不出使用 Python 的 for 循环来做到这一点的方法,有什么建议吗?

4

5 回答 5

6

这将是一个 for 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
于 2010-05-03T18:22:55.907 回答
2
names = ['john','John','james','James']
for name, capitalized_name in zip(names[::2], names[1::2]):
    print name, capitalized_name

请注意,您需要均匀数量的项目才能正常工作。

或者(也许更好;很难用很少的上下文来判断)使用 aset过滤列表以仅包含唯一名称(请注意,这会丢失顺序):

>>> 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
于 2010-05-03T18:21:19.740 回答
0

你可以只使用一个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

或者您正在寻找更多参与的东西?

于 2010-05-03T18:21:37.497 回答
0

当您遍历循环时,您可以尝试跟踪列表中的前一个名称。同时,当您要存储名称时,可以调用 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()

可能不是最有效的,但有效。

于 2010-05-03T18:38:50.223 回答
0

我的 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)

我不确定我是否完全理解了这个问题;你想达到什么目的?

于 2010-05-03T22:06:51.877 回答