2011-01-29 2 views
30

Если у меня есть список и вы хотите усечь его, чтобы его было не более 100 предметов, как мне это сделать?Как урезать список?

+1

Что вы попробовали? – SilentGhost

+0

Возможный дубликат http://stackoverflow.com/questions/1534939/how-to-trim-a-list-in-python –

ответ

58

Чтобы изменить список на месте (а не сделать более короткую копию списка), используйте:

del l[100:] 
+1

+1 Полностью забыл, что 'del' работает с ломтиками. – delnan

+3

Нарезка с помощью [: 100], как правило, является лучшим решением, поскольку она имеет постоянную производительность, но del [100:] становится медленнее для большего списка. – kefeizhou

+2

kefeizhou: Это может зависеть от того, что вы на самом деле хотите. Если вам действительно не нужны записи за пределами первых 100, вы должны их удалить.Говорить, что это вообще лучшая идея, чтобы держать их лживыми, потому что это занимает меньше времени, чем удаление их, кажется странным аргументом для меня. –

13

Вы можете использовать список нарезку:

a = a[0:100] 
+1

И если вы абсолютно настаиваете на освобождении неиспользованного остатка: del a [100:] – Confusion

+6

@Confusion: остаток получает сбор мусора автоматически, если 'a' была единственной ссылкой на список. –

0

Вы можете сделать что-то вроде:

truncated = list[:100] 
4

items[:100] другого упоминалось дает вам новый список, который содержит первые 100 наименований items. Если вы хотите изменить список на месте, либо используйте items[:] = items[:100] (назначение ломтика), либо while len(items) > 100: items.pop() использовать del items[100:] как предложено Ned Batchelder.

1

Вы можете использовать нарезку, если вы не возражаете, просто создавая новую копию списка который содержит только те элементы, которые вы хотите ... однако это оставляет исходный список немодифицированным.

>>> a = [0,1,2,3,4,5,6,7,8,9] 
>>> b = a[0:5] 
>>> a 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> b 
[0, 1, 2, 3, 4] 

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

>>> del a[5:] 
>>> a 
[0, 1, 2, 3, 4] 
1

Правильный ответ, конечно:

>>> x = range(10) 
>>> x 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> x = x[:5] 
>>> x 
[0, 1, 2, 3, 4] 

Но, что важно, если вы заинтересованы в значениях выше 100 и хотите потянуть их по одному по какой-либо причине, вы также можете использовать POP()

>>> x = range(10) 
>>> x 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> x.pop() 
9 
>>> x 
[0, 1, 2, 3, 4, 5, 6, 7, 8] 

Вы можете даже указать, какой элемент вытаскивать:

>>> x= range(10,20) 
>>> x 
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 
>>> x.pop(3) 
13 
>>> x.pop() 
19 
>>> x 
[10, 11, 12, 14, 15, 16, 17, 18] 
>>> x.pop(-1) 
18 
[10, 11, 12, 14, 15, 16, 17] 

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

Таким образом, тупой и yucky ответ (но и правильный) будет означать итерацию вниз. Я буду только вниз от 12 до 8 для удобства чтения здесь:

>>> x=range(12) 
>>> for i in range(len(x), 8, -1): 
...  y = x.pop() 
...  print "popping x: ", y, ", x=", x 
... 
popping x: 11 , x= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
popping x: 10 , x= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
popping x: 9 , x= [0, 1, 2, 3, 4, 5, 6, 7, 8] 
popping x: 8 , x= [0, 1, 2, 3, 4, 5, 6, 7] 

Конечно, это не является оптимальным, но я столкнулся с ситуацией, когда я нуждался в этом, так что я думал, что я разделю его здесь (Я усекаю список, когда вижу первое значение не-Нет).

Смежные вопросы