2010-05-03 116 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) 

我不知道我的理解這個問題正好;你想達到什麼目的?