«Списки срезов» и «многоточие» в Python;списки нарезки и списки списков со списками срезов
Вопрос
Оригинальный вопрос:Может ли кто-нибудь сказать мне, как использовать «списки фрагментов» и «многоточие»?Когда они полезны?Спасибо.
Вот что говорит определение языка о «slice_list» и «многоточие»;Ответ Алекса Мартелли указывает на их происхождение, а это не то, что я предполагал.
[http://docs.python.org/reference/expressions.html#tok-slicing][1]
5.3.3.Нарезки
extended_slicing::= primary "[" slice_list "]"
slice_list ::= slice_item ("," slice_item)* [","]
slice_item ::= выражение | proper_slice | эллипсис
многоточие ::= "..."
[1]: http://docs.python.org/reference/expressions.html#tok-slicing
Если кто-то (как и я) ищет способы атаковать список (или список списков) с помощью списка срезов, вот 5 способов получить список элементов из списка, выбранных списком срезов. и 2 способа сделать то же самое со списком списков, в этом случае применяя один фрагмент для каждого списка.Вывод в комментарии в конце.Я считаю, что h5, пример, в котором используются вложенные циклы for, труднее всего понять, если не используются значимые имена переменных (обновлено).
#!/usr/bin/env python
import itertools
puz = [(i + 100) for i in range(40)]
puz1 = list( puz)
puz2 = [(i + 200) for i in range(40)]
puz3 = [(i + 300) for i in range(40)]
puzs = [puz1,puz2,puz3]
sa = slice( 0,1,1)
sb = slice( 30,39,4)
sc = slice( -1, -15,-5)
ss = [sa,sb,sc]
def mapfunc( a,b):
return a[b]
f = map( mapfunc,[puz] * len(ss),ss)
print "f = ", f #same as g below
g = [ puz[i]
for i in ss ]
print "g = ",g #same as f, above
h1 = [ i
for i in itertools.chain( puz[sa],puz[sb],puz[sc]) ]
print "h1 = ", h1 #right
h2 = [ i
for i in itertools.chain( *(map( mapfunc,[puz] * len(ss),ss))) ]
print "h2 = ",h2 #right
h3 = [ i
for i in itertools.chain( *f) ]
print "h3 = ",h3 #right
h4 = [ i
for i in itertools.chain( *g) ]
print "h4 = ", h4 #also right
h5 = []
for slice_object in ss:
for list_element in puz[slice_object]:
h5.append( list_element)
print "h5 = ", h5 #right, too
print "=============================="
hh1 = [ i
for i in itertools.chain( *(map( mapfunc,puzs,ss))) ]
print "hh1 = ",hh1 #right
puz_s_pairs = zip( puzs,ss)
#print "puz_s_pairs = ",puz_s_pairs
hh2 = [ i
for i in itertools.chain( *(map( mapfunc,*zip( *puz_s_pairs)))) ]
print "hh2 = ",hh2 #right
'''
>>> execfile(r'D:/cygwin/home/usr01/wrk/py/pyexpts/list_of_slices_of_list.02.py')
f = [[100], [130, 134, 138], [139, 134, 129]]
g = [[100], [130, 134, 138], [139, 134, 129]]
h1 = [100, 130, 134, 138, 139, 134, 129]
h2 = [100, 130, 134, 138, 139, 134, 129]
h3 = [100, 130, 134, 138, 139, 134, 129]
h4 = [100, 130, 134, 138, 139, 134, 129]
h5 = [100, 130, 134, 138, 139, 134, 129]
==============================
hh1 = [100, 230, 234, 238, 339, 334, 329]
hh2 = [100, 230, 234, 238, 339, 334, 329]
'''
Решение
Списки срезов и многоточие изначально были введены в Python для обеспечения удобного синтаксического сахара для предшественника numpy (старого доброго Numeric).Если вы используете numpy (нет причин возвращаться к любому из его предшественников!-), вам, конечно, следует их использовать;если по какой-то странной причине вы создаете собственную реализацию сверхгибких многомерных массивов, вам определенно захочется изучить, как их использует numpy, и, возможно, внимательно имитировать это (это является в конце концов, довольно хорошо спроектировано).Я не могу придумать хорошего применения, кроме многомерных массивов.
Другие советы
Numpy использует их для реализации среза массива.
Я не слишком уверен в многоточии, поэтому не буду его касаться, чтобы не дать вам плохой ответ.
Вот нарезка списка:
Надеюсь, вы знаете, что индексы списков начинаются с 0.
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Индексирование в список:
l[0]
>>> 0
l[5]
>>> 5
Нарезка списка.Включен первый индекс, но не последний:
l[0:5]
>>> [0, 1, 2, 3, 4]
l[2:5]
>>> [2, 3, 4]
Верните весь список как ОДИН фрагмент:
l[:]
>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Получите фрагмент списка, содержащий каждый элемент, включая третий индекс и после него:
l[3:]
>>> [3, 4, 5, 6, 7, 8, 9]
Получите фрагмент списка, содержащий каждый элемент, но не включая пятый индекс:
l[:5]
>>> [0, 1, 2, 3, 4]
Вот что-то, чего вы не ожидаете от Python:
l[5:18] # note: there is no 18th index in this list
>>> [5, 6, 7, 8, 9]