В Python существует ли элегантный способ распечатки списка в пользовательском формате без явного цикла?

Я знаю, что ты можешь

print str(myList) 

получить

 [1, 2, 3] 

и вы можете сделать

 i = 0 for entry in myList: print str(i) + ":", entry i += 1 

получить

 0: 1 1: 2 2: 3 

Но есть ли способ, похожий на первый, получить результат, похожий на последний?

Имея мои ограниченные знания Python (и некоторую помощь из документации), мое лучшее:

 print '\n'.join([str(n) + ": " + str(entry) for (n, entry) in zip(range(0,len(myList)), myList)]) 

Это не намного меньше подробностей, но, по крайней мере, я получаю пользовательскую строку в одном (составном) заявлении. Вы можете сделать лучше?

 >>> lst = [1, 2, 3] >>> print('\n'.join('{}: {}'.format(*k) for k in enumerate(lst))) 0: 1 1: 2 2: 3 

Примечание. Вам просто нужно понять, что понимание списка или итерация по выражению генератора является явным циклом.

 l = [1, 2, 3] print '\n'.join(['%i: %s' % (n, l[n]) for n in xrange(len(l))]) 
 >>> from itertools import starmap >>> lst = [1, 2, 3] >>> print('\n'.join(starmap('{}: {}'.format, enumerate(lst)))) 0: 1 1: 2 2: 3 

Это использует itertools.starmap , который похож на map , кроме аргумента в функцию. Функция в этом случае – '{}: {}'.format .

Я предпочел бы понимание SilentGhost, но starmap – хорошая функция, о которой нужно знать.

 from time import clock from random import sample n = 500 myList = sample(xrange(10000),n) #print myList A,B,C,D = [],[],[],[] for i in xrange(100): t0 = clock() ecr =( '\n'.join('{}: {}'.format(*k) for k in enumerate(myList)) ) A.append(clock()-t0) t0 = clock() ecr = '\n'.join(str(n) + ": " + str(entry) for (n, entry) in zip(range(0,len(myList)), myList)) B.append(clock()-t0) t0 = clock() ecr = '\n'.join(map(lambda x: '%s: %s' % x, enumerate(myList))) C.append(clock()-t0) t0 = clock() ecr = '\n'.join('%s: %s' % x for x in enumerate(myList)) D.append(clock()-t0) print '\n'.join(('t1 = '+str(min(A))+' '+'{:.1%}.'.format(min(A)/min(D)), 't2 = '+str(min(B))+' '+'{:.1%}.'.format(min(B)/min(D)), 't3 = '+str(min(C))+' '+'{:.1%}.'.format(min(C)/min(D)), 't4 = '+str(min(D))+' '+'{:.1%}.'.format(min(D)/min(D)))) 

При n = 500:

 150.8%. 142.7%. 110.8%. 100.0%. 

При n = 5000:

 153.5%. 176.2%. 109.7%. 100.0%. 

О, теперь я вижу: только решение 3 с map () соответствует названию вопроса.

Другая:

 >>> lst=[10,11,12] >>> fmt="%i: %i" >>> for d in enumerate(lst): ... print(fmt%d) ... 0: 10 1: 11 2: 12 

Еще одна форма:

 >>> for i,j in enumerate(lst): print "%i: %i"%(i,j) 

Этот метод хорош, поскольку отдельные элементы в кортежах, произведенные путем перечисления, могут быть изменены, например:

 >>> for i,j in enumerate([3,4,5],1): print "%i^%i: %i "%(i,j,i**j) ... 1^3: 1 2^4: 16 3^5: 243 

Конечно, не забывайте, что вы можете получить кусочек от этого, например:

 >>> for i,j in list(enumerate(lst))[1:2]: print "%i: %i"%(i,j) ... 1: 11 

В функции печати python 3s:

 lst = [1, 2, 3] print('My list:', *lst, sep='\n- ') 

Вывод:

 My list: - 1 - 2 - 3 

Con : sep должен быть строкой, поэтому вы не можете изменять ее, основываясь на том, какой элемент вы печатаете. И для этого вам нужен заголовок (над ним был 'My list:' ).

Pro : вам не нужно join() список в строковый объект, что может быть полезно для больших списков. И все это довольно кратким и читаемым.

Начиная с этого:

 >>> lst = [1, 2, 3] >>> print('\n'.join('{}: {}'.format(*k) for k in enumerate(lst))) 0: 1 1: 2 2: 3 

Вы можете избавиться от join , передав \n в качестве разделителя для print

 >>> print(*('{}: {}'.format(*k) for k in enumerate(lst)), sep="\n") 0: 1 1: 2 2: 3 

Теперь вы видите, что можете использовать map , но вам нужно будет изменить строку формата (yuck!)

 >>> print(*(map('{0[0]}: {0[1]}'.format, enumerate(lst))), sep="\n") 0: 1 1: 2 2: 3 

или передать 2 последовательности для map . Отдельный счетчик и больше не перечисляет lst

 >>> from itertools import count >>> print(*(map('{}: {}'.format, count(), lst)), sep="\n") 0: 1 1: 2 2: 3