我有這樣的名單:Python的迭代問題
names = ['john','Jonh','james','James','Jardel']
我想對列表循環,並在同一個迭代的情況下不區分大小寫的匹配處理連續名稱。所以在第一次迭代中我會用'john'和'John'做一些事情,我希望下一次迭代以'james'開始。
我想不出一種方法來使用Python for循環來做到這一點,有什麼建議嗎?
我有這樣的名單:Python的迭代問題
names = ['john','Jonh','james','James','Jardel']
我想對列表循環,並在同一個迭代的情況下不區分大小寫的匹配處理連續名稱。所以在第一次迭代中我會用'john'和'John'做一些事情,我希望下一次迭代以'james'開始。
我想不出一種方法來使用Python 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
如何使用g var?我試圖打印它,但我得到這個:
這是因爲它是一個迭代器對象。你可以在for循環或列表理解中使用它(例如'[name for name in g]'),你會得到它的名字,但如果你嘗試使用它而沒有迭代它,它會就像你看到的那樣,只是作爲一個迭代器出現。要打印出名單列表,您可以使用'print list(g)',在打印之前將其轉換爲列表。 – 2010-05-03 19:00:12
'g'是當前組中項目的迭代器。你可以在'for'循環或列表理解中迭代它,或者用'list(g)'將它變成一個列表。一個可能的做法是打印當前組中由逗號分隔的名稱:print'','。join(g)',這是因爲'join'方法適用於任何迭代。 – 2010-05-03 19:03:06
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)
我不知道我的理解這個問題正好;你想達到什麼目的?
如果名稱不是連續的,例如'[「jo」,「Jim」,「jim」,「Jo」]',你會怎麼做? – OscarRyz 2010-05-03 18:22:43
你的第二個名字是Jonh。我想這是一個錯字,它應該是約翰? – extraneon 2010-05-03 18:23:42
就我個人而言,我會建立一套名稱,全部放在較低的位置,從而取消雙打,並根據需要進行大寫。但那可能不符合您的要求。 – extraneon 2010-05-03 18:25:28