Вы можете застегнуть их на молнию. то есть:
for a_row,b_row in zip(alist, blist):
for a_item, b_item in zip(a_row,b_row):
if a_item.isWhatever:
b_item.doSomething()
Однако накладные расходы на архивирование и итерацию элементов могут быть выше, чем в исходном методе, если вы редко используете b_item (то есть a_item.isWh независимо от того, что обычно является False). Вы можете использовать itertools.izip вместо zip, чтобы уменьшить влияние этого на память, но, вероятно, все равно будет немного медленнее, если вам не нужен b_item.
В качестве альтернативы, рассмотрите возможность использования списка 3D вместо этого, чтобы местность для ячейки i, j была в l [i] [j] [0], объекты в l [i] [j] [1] и т. Д., Или даже объединить объекты, так что вы можете сделать [i] [j] .terrain, [i] [j] .объект и т. д.
[Редактировать] Времена DzinX фактически показывают, что влияние дополнительной проверки для b_item не является значительным, кроме потери производительности при повторном поиске по индексу, поэтому выше (с использованием izip) Кажется, самый быстрый.
Я также дал быстрый тест для трехмерного подхода, и он все еще кажется более быстрым, поэтому, если вы сможете хранить свои данные в этой форме, доступ к ним может быть как более простым, так и более быстрым. Вот пример его использования:
# Initialise 3d list:
alist = [ [[A(a_args), B(b_args)] for i in xrange(WIDTH)] for j in xrange(HEIGHT)]
# Process it:
for row in xlist:
for a,b in row:
if a.isWhatever():
b.doSomething()
Вот мои временные значения для 10 циклов, использующих массив 1000x1000, с различными пропорциями isWh независимо от того, являются ли они истинными:
( Chance isWhatever is True )
Method 100% 50% 10% 1%
3d 3.422 2.151 1.067 0.824
izip 3.647 2.383 1.282 0.985
original 5.422 3.426 1.891 1.534