我想迭代两个列表,比如说:
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
答案 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