Python迭代两个列表跳过一些元素

时间:2015-12-14 15:14:58

标签: python iterator

我想迭代两个列表,比如说:

public static Bitmap retriveVideoFrameFromVideo(String videoPath)
                    throws Throwable
            {
                Bitmap bitmap = null;
                MediaMetadataRetriever mediaMetadataRetriever = null;
                try
                {
                    mediaMetadataRetriever = new MediaMetadataRetriever();
                    if (Build.VERSION.SDK_INT >= 14)
                        mediaMetadataRetriever.setDataSource(videoPath, new HashMap<String, String>());
                        else
                            mediaMetadataRetriever.setDataSource(videoPath);
                 //   mediaMetadataRetriever.setDataSource(videoPath);
                    bitmap = mediaMetadataRetriever.getFrameAtTime();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                    throw new Throwable(
                            "Exception in retriveVideoFrameFromVideo(String videoPath)"
                                    + e.getMessage());

                }
                finally
                {
                    if (mediaMetadataRetriever != null)
                    {
                        mediaMetadataRetriever.release();
                    }
                }
                return bitmap;
            }

主要问题是,有时我想跳过一个元素,因此zip和itertools.izip将无法正常工作。我很乐意只做一个izip然后接下来,就像这样:

alist = ['a_1', 'a_2', 'a_2', 'a_3', 'a_4']
blist = ['b_1', 'b_2', 'b_4']

这个例子是最小的,以显示预期的行为,我知道它不是a和b的对称,只会跳过一次,但原则就在那里。遗憾的是,这不起作用,因为变量a只是值,而不是迭代器,所以我得到一个类型错误:

for a,b in itertools.izip(alist,blist):
    asplit = a.split("_")
    bsplit = b.split("_")
    if asplit[len(asplit) -1] < bsplit[len(bsplit) -1]:
        next(a)

我可能会因为思考stl迭代器(C ++)而产生偏见,但必须有一种python方法来实现这一点。任何帮助将不胜感激!

修改

似乎我应该更多地指定行为。如果在循环结束时(在TypeError: str object is not an iterator 语句之后,我有

if ...

然后我会期待输出:

print a, b

我认为很清楚,但我选择的列表很差,因为输出似乎不清楚。如果我有a_1 b_1 a_2 b_2 a_3 b_4 代替,这将是更直观的方式,那么我应该期待

while asplit < bsplit

1 个答案:

答案 0 :(得分:1)

编辑之后:如果你不想要一些对称的东西,那么你可能不希望在一个foreach指令中迭代这两个列表:

for b in blist:
    for a in alist:
        asplit = a.split("_")
        bsplit = b.split("_")
        if asplit[-1]< bsplit[-1]:
            continue
        else:
            break
    print a, b

输出:

a_1 b_1
a_2 b_2
a_4 b_4