2016-11-14 14 views
0

Я хочу найти первые 3 элемента в списке с помощью my_list[:3], но я не могу гарантировать, что этот список будет по крайней мере длина 3.Допустимо ли использовать размер остановки, превышающий длину списка при использовании двоеточия для списка фрагментов в Python?

Я могу только найти примеры с данным списком и небольшой остановкой. Итак, я хочу знать, приемлемо ли my_list[:3] без проверки длины списка.

Спасибо!

Я пробовал самостоятельно, и он работает хорошо. Но я хочу посмотреть, есть ли какое-либо описание документа.

+0

Да, это прекрасно работает. –

+8

Требуется гораздо меньше времени, чтобы проверить его в оболочке, чем на вопрос о переполнении стека. Python является интерактивным, поэтому взаимодействуйте с ним. –

+1

, если список короче, чем 3 элемента, тогда '[: 3]' дает меньше элементов без ошибок, поэтому вам нужно будет проверить длину, если вам нужен третий элемент из 'my_list [: 3]'. – furas

ответ

0

Дано:

>>> li=[1,2,3] 

Есть действительно только два случая.

1) Если срез, который выходит за пределы конца списка, он будет доставлять перекрытие определенных элементов и пустой список за пределы без ошибок:

>>> li[2:] 
[3] 
>>> li[3:] 
[] 
>>> li[5555:] 
[] 
>>> li[1:55555] 
[2, 3] 
>>> li[555:55555] 
[] 

2) Учитывая назначение ломтика, перекрытие элементы заменяются, а остальные элементы добавляются без ошибок:

>>> li[1:5]=[12,13,14,15,16] 
>>> li 
[1, 12, 13, 14, 15, 16, 15] 
>>> li[555:556]=[555,556] 
>>> li 
[1, 12, 13, 14, 15, 16, 15, 555, 556] 

в последнем случае есть, назначение ломтика было несуществующих элементы были, следовательно, только прилагаемых к существующим элементам.

Однако, если правая ломтика рука не соответствуют существующим элементам с левой стороны, может быть ValueError для не существующих элементов с расширенным срезом (то есть, если у вас есть list_object[start:stop:step]):

>>> li 
[1, 2, 3] 
>>> li[1:7:2]=range(4) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: attempt to assign sequence of size 4 to extended slice of size 1 

Но если они существуют, вы можете сделать расширенное назначение среза:

>>> li=['X']*10 
>>> li 
['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'] 
>>> li[1:10:2]=range(5) 
>>> li 
['X', 0, 'X', 1, 'X', 2, 'X', 3, 'X', 4] 

Большой частью времени - это работает, как ожидалось. Если вы хотите использовать шаг для назначений, элементы должны быть существующими.

1

Это нормально, независимо от длины списка.

Это поведение вызова, который вы пытаетесь сделать:

a = [1,2,3,4] 
b = [1,2] 
a[:3] 
>>>[1,2,3] 
b[:3] 
>>>[1,2] 

По существу, он будет вести себя так, как вы хотите.