Давайте разложим его на части.
Во-первых, вот только listcomp по себе:
[(x+a, r[a:b][x]) for x in xrange(len(r[a:b]))]
Это эквивалентно этой петле:
result=[]
for x in xrange(len(r[a:b])):
result.append((x+a, r[a:b][x]))
Итак, что же каждая часть делать?
r[a:b]
- это подпоследовательность r
от индекса a (включительно) до b (исключительно). Итак, len(r[a:b])
- это почти причудливый способ сказать b-a
, но не совсем, потому что b
может пройти мимо конца последовательности, или любой из индексов может быть отрицательным индексом. И xrange(len(r[a:b]))
- это всего лишь цифры от 0 до этой длины (опять же эксклюзивные).
Теперь для каждого из этих чисел x
от 0 до этой длины мы создаем кортеж (x+a, r[a:b][x])
.
Давайте работать на примере:
>>> r = ['a', 'b', 'c', 'd', 'e', 'f']
>>> a = 2
>>> b = 4
>>> r[a:b]
['c', 'd']
>>> len(r[a:b])
2
>>> list(xrange(len(r[a:b])))
[0, 1]
>>> x=0
>>> (x+a, r[a:b][x])
(2, 'c')
>>> x = 1
>>> (x+a, r[a:b][x])
(3, 'd')
Итак, как вы можете видеть, это создание списка (индекс, значение) для индексов от a
к b
, как это:
[(2, 'c'), (3, 'd')]
гораздо лучше способ написать то же самое, это:
>>> list(enumerate(r))[a:b]
[(2, 'c'), (3, 'd')]
... или ...
>>> list(enumerate(r[a:b], a)
[(2, 'c'), (3, 'd')]
Это хороший пример того, почему отсчеты читаемости при кодировании. – iCodez
Это означает, что тот, кто написал этот код, не знал о 'перечислении' и не понимал' for' циклы. – abarnert
'max (enumerate (my_list [start: end], start), key = itemgetter (1))' будет делать то же самое и более ясно для меня ... не знаю, почему эта функция существует даже –