2010-07-08 2 views
2

Я новичок в python. У меня есть элемент списка выглядит следующим образом:Как удалить значения из списка позиций

rank_item = [ 
    (9, 0.99999999745996648), 
    (8, 0.99999996796861101), 
    (1, 0.99999996796861101), 
    (10, 0.0) ] 

Вопрос заключается в том, как я могу удалить список элементов со значением 0.0 и вернуть

[(9, 0.99999999745996648), (8, 0.99999996796861101), (1, 0.99999996796861101)] 

ответ

5

Использование list.remove - который изменит ваш rank_item список не- место:

rank_item.remove((10, 0.0)) 

rank_item будет содержать:

[(9, 0.99999999745996648), (8, 0.99999996796861101), (1, 0.99999996796861101)] 

Или, если вы хотите, чтобы удалить все кортежи из списка, которые имеют значение 0.0 в положении 1, вы можете попробовать list comprehension, например:

[ x for x in rank_item if x[1] != 0.0 ] 
+0

Примечание: это изменит 'rank_item' объект. – Karmastan

5
[x for x in rank_item if x[1] != 0.0] 
+1

Примечание: это создаст новый список без изменения 'rank_item' – Karmastan

3
>>> [i for i in rank_item if i[1]] 
[(9, 0.9999999974599665), (8, 0.999999967968611), (1, 0.999999967968611)] 
1

Для более общего случая вы можете воспользоваться пониманием по спискам:

new_list = [(a, b) for a, b in old_list if b != 0] 

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

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

1

Тест скорости:

>>> import timeit 
>>> it = lambda : list(filter(lambda x: x[1]!=0, rank_item)) 
>>> timeit.timeit(it) 
3.7716277663630535 

>>> it2 = lambda: [x for x in rank_item if x[1] != 0.0] 
>>> timeit.timeit(it2) 
1.2550897693390652 

>>> it3 = lambda: [i for i in rank_item if i[1]] 
>>> timeit.timeit(it3) 
1.147179730129892 

>>> it4 = lambda: list(itertools.takewhile(lambda x: x[1] != 0, rank_item)) 
>>> timeit.timeit(it4) 
3.8272935335999136 
Смежные вопросы