2013-07-25 4 views
1

У меня есть этот массив словарейPop значение из, если меньше, чем х

for row in array: 
     if row['val'] < 11: 
      array.pop(array.index(row)) 

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

Мое решение прямо сейчас состоит в том, чтобы дважды запустить оператор for, который затем удаляет дополнительное значение. Как мне это сделать?

ответ

1
[el for el in array if test_to_be_preserved(el)] 

Где test_to_be_preserved это функция, возвращение True если el должны быть избавлены и False если el должны быть удалены из array

Или, если вы не возражаете, изменяя порядок элементов в исходном массив:

i = 0 
    while i < len(array): 
    el = array[i] 
    if should_remove(el): 
     array[i] = array.pop() 
    else: 
     i += 1 
+0

+1 за указание, что 'while' петля делает трюк. – 2rs2ts

+1

Да, это полезный трюк удаления элемента O (1) из вектора (я использовал его довольно часто с std C++-векторами), если вы не возражаете против порядка элементов. –

0

Вы можете использовать filter():

>>> nums = [random.randint(1, 101) for x in xrange(20)] 
>>> nums 
[75, 101, 21, 69, 44, 98, 50, 45, 63, 73, 8, 44, 54, 42, 66, 68, 98, 56, 7, 36] 
>>> (lambda x, l: filter(lambda y: y >= x, l))(25, nums) 
[75, 101, 69, 44, 98, 50, 45, 63, 73, 44, 54, 42, 66, 68, 98, 56, 36] 
Смежные вопросы