如何一次访问2个列表,同时展望izipèu?Python

2024-04-26 03:27:26 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码一次只能访问一个列表,每个循环向前看一个元素:

from itertools import izip_longest

alist = ['foo','bar','duh']
blist = ['ofo','ardavak','dot','dotdat']

for i, plus1 in izip_longest(alist, alist[1:], fillvalue=None):
  iplus1 = i + plus1 if plus1 is not None else ""

for j, plus1 in izip_longest(blist, blist[1:], fillvalue=None):
  jplus1 = j + plus1 if plus1 is not None else ""

如何同时为2个列表向前看每个循环1个元素?比如:

for (i,plus1),(j,plus1) in izip(izip_longest(alist, alist[1:], fillvalue=None), izip_longest(blist, blist[1:], fillvalue=None)):
  print i,j
  print i,j+plus1
  print i+plus1,j
  print i+plus1,j+plus1

所需的输出应如下所示:

foo ofo
foo ofoardavak
foobar ofo
foobar ofoardvak
bar ardavak
bar ardavakdot
barduh ardavak
barduh ardavakdot
duh dot
duh dotdotdat
 dot
 dotdotdat
 dotdat

 dotdat

Tags: nonelongestfoobarplusdotprintduh
2条回答
from itertools import product,izip,izip_longest

def pairs(lst):
    i = iter(lst)
    prev = i.next()
    for item in i:
        yield prev, prev+item   
        prev = item

[list(product(*v)) for v in izip(*map(pairs,
                   izip(*izip_longest(alist,blist,fillvalue=''))))]

输出:

[[('foo', 'ofo'),
  ('foo', 'ofoardavak'),
  ('foobar', 'ofo'),
  ('foobar', 'ofoardavak')],
 [('bar', 'ardavak'),
  ('bar', 'ardavakdot'),
  ('barduh', 'ardavak'),
  ('barduh', 'ardavakdot')],
 [('duh', 'dot'), ('duh', 'dotdotdat'), ('duh', 'dot'), ('duh', 'dotdotdat')]]

可能是这样的:

from itertools import izip_longest

alist = ['foo','bar','duh']
blist = ['ofo','ardavak','dot','dotdat']

combined_list = list(izip_longest(alist, blist, fillvalue=""))

for (i,j),(iplus1,jplus1) in izip_longest(combined_list, combined_list[1:], fillvalue=("", "")):
    print i,j
    print i,j+jplus1
    print i+iplus1,j
    print i+iplus1,j+jplus1

但是请注意,zip()只接受min(len(alist),len(blist))元素,即返回的列表的长度被截断为最短参数序列的长度。你知道吗

相关问题 更多 >