2011-09-24 50 views
3

列表項我有蟒蛇與下面的示例內容的列表:自定義迭代在Python中

['mark', 29, 'american', 'james', 45, 'british', 'arthur', 76, 'australian'] 

因爲很明顯,從模式列表中的第一項是名字,二是年齡和第三是國籍。 會有什麼遍歷它,從而爲循環分隔元素中的一個最有效的方式。

我是新來的python,不知道這樣做的最佳方法。這樣做的

for i in len(0, len(my_list): 
    name = 
    age = 
    nationality = 

回答

1

一個方法是:

names = mylist[0::3] 
ages = mylist[1::3] 
nationalities = mylist[2::3] 

然後你可以遍歷同3步

for name in names: 
    print name 
etc. 
3

只是循環:

for i in xrange(len(my_list)/3): 
    name, age, nationality = my_list[3*i:3*i+3] 
+0

LEN只需要一個arguement,兩個給定。如果我們改變LEN到範圍,我們得到一個錯誤:類型錯誤:不支持的操作數類型(S)爲/:「名單」和「廉政」 – whatf

+0

@ user902620應該說的xrange ..更新 –

+1

@ user902620笑你爲什麼要接受對方的回答? –

3

的最佳方式實施新類型的迭代是寫一個基因要麼。他們讓你封裝迭代風格,它從你的代碼的其餘部分分開:

def by_threes(seq): 
    it = iter(seq) 
    while True: 
     yield next(it), next(it), next(it) 

for a, b, c in by_threes(range(20)): 
    print a,b,c 

打印:如果你有需要可以靈活tuplize序列

0 1 2 
3 4 5 
6 7 8 
9 10 11 
12 13 14 
15 16 17 

,你可以這樣做:

def by_chunks(seq, n): 
    """Yield lists [a,b,..] from `seq`, each list having `n` elements.""" 
    l = [] 
    for i, x in enumerate(seq): 
     l.append(x) 
     if (i % n) == n-1: 
      yield l 
      l = [] 
3

zip(或itertools.izip)使用步驟指數:

>>> l = ['mark', 29, 'american', 'james', 45, 'british', 'arthur', 76, 'australian'] 
>>> for name, age, nationality in zip(l[::3], l[1::3], l[2::3]): 
...  print (name, age, nationality) 
... 
('mark', 29, 'american') 
('james', 45, 'british') 
('arthur', 76, 'australian') 
4

試試這個方便的模式:

from itertools import izip 

iters = [iter(my_list)] * 3 # change 3 to number of items in each group 
for name, age, nationality in izip(*iters): 
    print name, age, nationality 
+0

有趣,並與可迭代的源工作,不只是列出。 –