2011-09-24 53 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

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