В python хороший способ удалить список из списка dicts - PullRequest
2 голосов
/ 21 мая 2010

У меня есть список диктов:

list =  [{'title': u'Politics', 'id': 1L, 'title_url': u'Politics'}, 
         {'id': 3L, 'title_url': u'Test', 'title': u'Test'}]

Я хочу удалить элемент списка с заголовком = 'Test'

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

Спасибо.

Ответы [ 5 ]

6 голосов
/ 21 мая 2010
[i for i in lst if i['title']!= u'Test']

Также, пожалуйста, не используйте list в качестве имени переменной, оно затенено встроенным.

4 голосов
/ 21 мая 2010
mylist = [x for x in mylist if x['title'] != 'Test']

Возможны и другие решения, но любое решение будет O (n), так как вы должны искать во всем списке правильный элемент. Учитывая это, используйте самый простой подход.

3 голосов
/ 21 мая 2010

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

lst =  [{'title': u'Politics', 'id': 1L, 'title_url': u'Politics'},  
    {'id': 3L, 'title_url': u'Test', 'title': u'Test'}]  
for i in xrange(len(lst)-1,0,-1):  
if lst[i].get("title")=="Test":  
    del lst[i]  

Изменяет список на месте, а не копирует его, справляется с удалением нескольких диктов, в которых есть "title": "Test", и справляется, если такого диктанта нет.

Обратите внимание, что .get ("title") возвращает None, если нет соответствующего ключа, тогда как ["title"] вызывает исключение.

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

for i,d in enumerate(lst):  
    if d.get("title")=="Test":  
        del lst[i]  
        break  

Наверное, проще всего придерживаться

[x for x in lst if x.get("title")!="Test"]
3 голосов
/ 21 мая 2010
L = [{'title': u'Politics', 'id': 1L, 'title_url': u'Politics'}, 
     {'id': 3L, 'title_url': u'Test', 'title': u'Test'}]
L = [d for d in L if d['title'] != u'Test']

Советы: элементы в dict все равно не упорядочены. Использование имени встроенной функции, такой как list, в качестве имени переменной - плохая идея.

0 голосов
/ 21 мая 2010
new_lst = filter(lambda x: 'title' in x and x['title']!=u'Test', lst)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...