Python equivalente de Haskell (para indexar una lista)

Tengo una lista de elementos en python. No sé el número de elementos en la lista. Me gustaría añadir índices a la lista.

En Haskell, podría hacer lo siguiente

zip [1..] "abcdefghijklmnop" [(1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e'),(6,'f'),(7,'g'),(8,'h'),(9,'i'),(10,'j'),(11,'k'),(12,'l'),(13,'m'),(14,'n'),(15,'o'),(16,'p')] 

Ahora imagina que la cadena era de tamaño desconocido. Esto todavía funcionaría en Haskell, y la lista de enteros proporciona tantos enteros como sea necesario hasta que la cadena se agote.

¿Cómo se haría uno equivalente en Python?

He intentado esto:

 s = "abcdefghijklmnop" indexedlist = [] for i,c in enumerate(s): indexedlist.append((i,c)) >>> indexedlist [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f'), (6, 'g'), (7, 'h'), (8, 'i'), (9, 'j'), (10, 'k'), (11, 'l'), (12, 'm'), (13, 'n'), (14, 'o'), (15, 'p')] 

Y funciona, pero me pregunto si hay una forma más corta / limpia, ya que es 4 líneas de código y se siente mucho.

Solo haz una list(enumerate(s)) . Esto itera sobre el objeto enumerate y lo convierte en una list .

Puedes simplificarlo con una lista de comprensión:

 >>> [i for i in enumerate(s)] 

Puede utilizar la función de range con zip .

Para Python 2:

 >>> s = "abcdefghijklmnop" >>> zip(range(16),s) [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f'), (6, 'g'), (7, 'h'), (8, 'i'), (9, 'j'), (10, 'k'), (11, 'l'), (12, 'm'), (13, 'n'), (14, 'o'), (15, 'p')] 

Para Python 3:

 >>> s = "abcdefghijklmnop" >>> list(zip(range(16),s)) [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f'), (6, 'g'), (7, 'h'), (8, 'i'), (9, 'j'), (10, 'k'), (11, 'l'), (12, 'm'), (13, 'n'), (14, 'o'), (15, 'p')] 

Usar enumerate es definitivamente el camino a seguir, pero aquí hay una solución un poco más funcional con toolz :

 from toolz.itertoolz import iterate, zip zip(iterate(lambda x: x + 1, 0), "abcdefghijklmnop")