2010-05-03 70 views
1

我有这样的名单:Python的迭代问题

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

我想对列表循环,并在同一个迭代的情况下不区分大小写的匹配处理连续名称。所以在第一次迭代中我会用'john'和'John'做一些事情,我希望下一次迭代以'james'开始。

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

+0

如果名称不是连续的,例如'[“jo”,“Jim”,“jim”,“Jo”]',你会怎么做? – OscarRyz 2010-05-03 18:22:43

+1

你的第二个名字是Jonh。我想这是一个错字,它应该是约翰? – extraneon 2010-05-03 18:23:42

+0

就我个人而言,我会建立一套名称,全部放在较低的位置,从而取消双打,并根据需要进行大写。但那可能不符合您的要求。 – extraneon 2010-05-03 18:25:28

回答

6

这将是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 
+0

如何使用g var?我试图打印它,但我得到这个: 我显然是Python的noob,所以请不要恨我:) – hdx 2010-05-03 18:54:30

+0

这是因为它是一个迭代器对象。你可以在for循环或列表理解中使用它(例如'[name for name in g]'),你会得到它的名字,但如果你尝试使用它而没有迭代它,它会就像你看到的那样,只是作为一个迭代器出现。要打印出名单列表,您可以使用'print list(g)',在打印之前将其转换为列表。 – 2010-05-03 19:00:12

+1

'g'是当前组中项目的迭代器。你可以在'for'循环或列表理解中迭代它,或者用'list(g)'将它变成一个列表。一个可能的做法是打印当前组中由逗号分隔的名称:print'','。join(g)',这是因为'join'方法适用于任何迭代。 – 2010-05-03 19:03:06

2
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 
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 

或者你在寻找一些更多的参与?

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

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

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) 

我不知道我的理解这个问题正好;你想达到什么目的?