在Python中成对迭代迭代列表的干净方法?

时间:2015-10-26 18:19:30

标签: python performance list for-loop split

我正在使用string.split(':')函数,以便我的列表包含firstname:lastname对(例如["John", "Doe", "Alex", "Jacobson" ...]

我知道如何使用一个基本的for循环,每次我将索引增加两个(并与列表的长度进行比较),但我想以更具体的Python方式处理它。

我可以采用哪种更清晰的循环结构,这可以让我考虑前两个指数,然后是接下来的两个,等等?

4 个答案:

答案 0 :(得分:3)

点击列表中的iterzip

l = ["John", "Doe", "Alex", "Jacobson"]

it = iter(l)

for f,l  in zip(it, it):
    print(f,l)

John Doe
Alex Jacobson

zip(it,it)每次只使用迭代器中的两个元素,直到迭代器耗尽,所以我们最终会得到配对的名字和姓氏。它有点等同于:

In [86]: l = ["John", "Doe", "Alex", "Jacobson"]

In [87]: it = iter(l)

In [88]: f,l = next(it),next(it)

In [89]: f,l
Out[89]: ('John', 'Doe')

In [91]: f,l
Out[91]: ('Alex', 'Jacobson')

答案 1 :(得分:1)

for first,last in zip(string[::2],string[1::2]):

应该有用。

编辑:抱歉,我并不是很简洁。

zip的作用是创建一个允许for循环中的两个变量的对象。在这种情况下,我们创建一个zip对象,其中包含从索引0(string[::2])开始的每个其他对象的切片列表以及从索引1(string[1::2')开始的每个其他对象的切片列表。然后我们可以使用两个迭代器(first,last)来遍历该zip列表。

>>> l1 = [1,2,3,4]
>>> l2= [5,6,7,8]
>>> zip(l1,l2)
<zip object at 0x02241030>
>>> for l,k in zip(l1,l2): print(l+k)
...
6
8
10
12
>>> for l,k in zip(l1,l2): print (l,k)
...
1 5
2 6
3 7
4 8

答案 2 :(得分:1)

>>> import itertools
>>> L = ["John", "Doe", "Alex", "Jacobson"]
>>> for fname, lname in zip(*itertools.repeat(iter(L), 2)): print(fname, lname)
...
John Doe
Alex Jacobson

答案 3 :(得分:0)

你可以使用拼接,即 假设所有名称都在x

fname = x[::2]
lname = x[1::2]
y = []
for a,b in zip(fname,lname):
    y.append({'fname':a,
              'lname':b,})

现在您可以轻松地进行迭代,

for i in y:
    print i['fname'], i['lname']