удалить дубликаты из вложенных словарей в списке

быстрый и очень простой вопрос о новичках.

Если у меня есть список словарей, выглядящих так:

L = [] L.append({"value1": value1, "value2": value2, "value3": value3, "value4": value4}) 

Предположим, существует несколько записей, где value3 и value4 идентичны другим вложенным словарям. Как быстро и легко найти и удалить эти дубликаты словарей.

Сохранение порядка не имеет значения.

Благодарю.

РЕДАКТИРОВАТЬ:

Если есть пять входов, например:

 L = [{"value1": fssd, "value2": dsfds, "value3": abcd, "value4": gk}, {"value1": asdasd, "value2": asdas, "value3": dafdd, "value4": sdfsdf}, {"value1": sdfsf, "value2": sdfsdf, "value3": abcd, "value4": gk}, {"value1": asddas, "value2": asdsa, "value3": abcd, "value4": gk}, {"value1": asdasd, "value2": dskksks, "value3": ldlsld, "value4": sdlsld}] 

Выходные данные выглядят следующим образом:

 L = [{"value1": fssd, "value2": dsfds, "value3": abcd, "value4": gk}, {"value1": asdasd, "value2": asdas, "value3": dafdd, "value4": sdfsdf}, {"value1": asdasd, "value2": dskksks, "value3": ldlsld, "value4": sdlsld} 

  • Поддержка Python ElementTree для синтаксического анализа неизвестных объектов XML?
  • Сценарии Python для глотания шейп-файла в базу PostgreSQL / PostGIS с использованием shp2pgsql.exe на окнах
  • Учебное пособие по русскому языку
  • Чтение двоичных данных Python
  • AttributeError: объект 'module' не имеет атрибута 'pydebug'
  • Как я могу форматировать каждую другую линию, которая должна быть объединена с линией до нее? (В Python)
  • Чтение * .wav-файлов в Python
  • Интерпретация данных WAV
  • 6 Solutions collect form web for “удалить дубликаты из вложенных словарей в списке”

    В Python 2.6 или 3. *:

     import itertools import pprint L = [{"value1": "fssd", "value2": "dsfds", "value3": "abcd", "value4": "gk"}, {"value1": "asdasd", "value2": "asdas", "value3": "dafdd", "value4": "sdfsdf"}, {"value1": "sdfsf", "value2": "sdfsdf", "value3": "abcd", "value4": "gk"}, {"value1": "asddas", "value2": "asdsa", "value3": "abcd", "value4": "gk"}, {"value1": "asdasd", "value2": "dskksks", "value3": "ldlsld", "value4": "sdlsld"}] getvals = operator.itemgetter('value3', 'value4') L.sort(key=getvals) result = [] for k, g in itertools.groupby(L, getvals): result.append(g.next()) L[:] = result pprint.pprint(L) 

    Почти то же самое в Python 2.5, за исключением того, что вы должны использовать g.next () вместо следующего (g) в append.

    Вот один из способов:

     keyfunc = lambda d: (d['value3'], d['value4']) from itertools import groupby giter = groupby(sorted(L, key=keyfunc), keyfunc) L2 = [g[1].next() for g in giter] print L2 

    Вы можете использовать временный массив для хранения элементов dict. Предыдущий код прослушивался для удаления элементов в цикле for.

     (v,r) = ([],[]) for i in l: if ('value4', i['value4']) not in v and ('value3', i['value3']) not in v: r.append(i) v.extend(i.items()) l = r 

    Ваш тест:

     l = [{"value1": 'fssd', "value2": 'dsfds', "value3": 'abcd', "value4": 'gk'}, {"value1": 'asdasd', "value2": 'asdas', "value3": 'dafdd', "value4": 'sdfsdf'}, {"value1": 'sdfsf', "value2": 'sdfsdf', "value3": 'abcd', "value4": 'gk'}, {"value1": 'asddas', "value2": 'asdsa', "value3": 'abcd', "value4": 'gk'}, {"value1": 'asdasd', "value2": 'dskksks', "value3": 'ldlsld', "value4": 'sdlsld'}] 

    Выходы

     {'value4': 'gk', 'value3': 'abcd', 'value2': 'dsfds', 'value1': 'fssd'} {'value4': 'sdfsdf', 'value3': 'dafdd', 'value2': 'asdas', 'value1': 'asdasd'} {'value4': 'sdlsld', 'value3': 'ldlsld', 'value2': 'dskksks', 'value1': 'asdasd'} 
     for dic in list: for anotherdic in list: if dic != anotherdic: if dic["value3"] == anotherdic["value3"] or dic["value4"] == anotherdic["value4"]: list.remove(anotherdic) 

    Протестировано

     list = [{"value1": 'fssd', "value2": 'dsfds', "value3": 'abcd', "value4": 'gk'}, {"value1": 'asdasd', "value2": 'asdas', "value3": 'dafdd', "value4": 'sdfsdf'}, {"value1": 'sdfsf', "value2": 'sdfsdf', "value3": 'abcd', "value4": 'gk'}, {"value1": 'asddas', "value2": 'asdsa', "value3": 'abcd', "value4": 'gk'}, {"value1": 'asdasd', "value2": 'dskksks', "value3": 'ldlsld', "value4": 'sdlsld'}] 

    отлично работал для меня 🙂

    Это список одного словаря, но, если предположить, что в списке l есть больше словарей l :

     l = [ldict for ldict in l if ldict.get("value3") != value3 or ldict.get("value4") != value4] 

    Но это то, что вы действительно хотите сделать? Возможно, вам нужно уточнить свое описание.

    BTW, не используйте list как имя, так как это имя встроенного Python.

    EDIT: Предполагая, что вы начали со списков словарей, а не список списков из 1 словаря, каждый из которых должен работать с вашим примером. Это не сработало бы, если бы ни одно из значений было None, поэтому лучше что-то вроде:

     l = [ldict for ldict in l if not ( ("value3" in ldict and ldict["value3"] == value3) and ("value4" in ldict and ldict["value4"] == value4) )] 

    Но это все еще кажется необычной структурой данных.

    EDIT: нет необходимости использовать явный get s.

    Кроме того, в решениях всегда есть компромиссы. Без дополнительной информации и без фактического измерения трудно понять, какие компромиссы производительности наиболее важны для проблемы. Но, поскольку дзен- сез: «Простой лучше, чем сложный».

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

    (Протестировано с помощью 2.5.2)

     tempDict = {} for d in L[::-1]: tempDict[(d["value3"],d["value4"])] = d L[:] = tempDict.itervalues() tempDict = None 
    Python - лучший язык программирования в мире.