2015-06-26 2 views
1

Итак, у меня есть список словарей, где каждый словарь содержит две пары ключ-значение. Что-то вродеУдаление словаря из списка словарей в python

l1 = [{'key1':'value1','key2':'value2'}, 
     {'key1':'value1','key2':'value2'}, 
     ... 
    ] 

Теперь я хочу, чтобы удалить словарь из этого списка просто проверять первый key и его value. Я могу проверить, присутствует ли целый список в списке, а затем удалить его. Но я просто хочу проверить, присутствует ли словарь с конкретным first key или нет в списке. Такой словарь будет уникальным. И я хочу впоследствии удалить этот словарь из этого списка. Как мне это сделать?

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

l1.remove({'key1':'value1', 'key2':'value2'}) 

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

+0

Хотите ли вы сделать что-то отличное от того, чтобы перебирать каждый словарь, проверять его и удалять, если необходимо? –

+0

Да, я хочу, чтобы не перебирать весь список и не проверять «первый ключ» каждого словаря –

+1

словарь не имеет последовательности. Таким образом, первым ключом может быть любое значение –

ответ

1

Не звоните в свои списки list!

Использовать список осмысления.

ключ-значение пары

Для удаления элементов списка, когда конкретный ключ-значение пары присутствует:

l1 = [{'key1':'value1','key2':'value2'}, 
     {'key1':'value3','key2':'value4'}] 
l2 = [element for element in l1 if element.get('key1', '') != 'value1'] 

(Обратите внимание get метод с возвращаемым значением по умолчанию).

ключ присутствует

Для удаления элементов списка, когда конкретный ключ присутствует:

l2 = [element for element in l1 if 'key1' in element] 

Замечания

  • стандартные словари неупорядоченные, так что нет такой вещи, как «первый» ключ.
+0

I сделал два ответа, поскольку вопрос был отредактирован во время ввода. –

+3

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

+0

Я сделал редактирование, чтобы сделать его более понятным. Пожалуйста, смотрите. Из-за ограничений я не могу сделать другой список –

3

Учитывая,

ds = [{'key1': 'value1', 'key2': 'value2'}, 
     {'key1', 'value3', 'key2', 'value4'}, 
     ...] 

Вы можете удалить словарь с уникальным ключ-значение, используя список понимание:

ds = [d for d in ds if d['key1'] != 'value1'] 

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

for i, d in enumerate(ds): 
    if d['key1'] == 'value1': 
     d1 = ds.pop(i) 
     break 

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

ds = {'value1': {'key1': 'value1', 'key2': 'value2'}, 
     'value3': {'key1', 'value3', 'key2', 'value4'}, 
     ...} 

Поскольку ds['value1'] является O (1) (немедленный) , тогда как любой обход - O (n) (должен переходить весь список в худшем случае).

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