Форум сайта python.su
Доброго всем времени суток.
Имеется список словарей. Элементы списка теоретически должны быть уникальны, в терминологии БД - по нескольким полям (ключам словарей), допустим они будут называться key1, key2, key3.
Несмотря на то, что теоретически элементы должны быть уникальными - на практике это может быть не так. Поэтому надо найти, по терминологии БД - все строки (словари), неуниакальные по значениям вышеобозначенных полей (ключей). По идее это можно было бы сделать циклами, но такое решение вряд ли будет оптимальным.
Как это сделать питонично, например, с помощью генераторов списков?
Офлайн
Напишите конкретные примеры словарей с даннымии укажите какая конкретно уникальность вас интересует
Офлайн
Примерно так (19.04.2018 по-другому отформатировал код, кажется, так легче читается):
l = [ {'key1': 'home', 'key2': 'word', 'key3': 'that', 'key4': 842268745}, # не уникален, у эл-та с индексом 3 такие же значения: {'key1': 'secret', 'key2': 'terrible', 'key3': 'phone', 'key4': 654}, {'key1': 'aback', 'key2': 'tippy', 'key3': 'fireworks', 'key4': 123}, # не уникален, у эл-та с индексом 1 такие же значения: {'key1': 'secret', 'key2': 'terrible', 'key3': 'phone', 'key4': 23689633}, {'key1': 'murage', 'key2': 'sweep', 'key3': 'transmit', 'key4': 9875}, # не уникален, у эл-тов с индексами 8 и 9 такие же значения: {'key1': 'beagle', 'key2': 'cloistral', 'key3': 'close', 'key4': 632125}, {'key1': 'cognitive', 'key2': 'coin', 'key3': 'jubilant', 'key4': 96}, {'key1': 'keel', 'key2': 'lately', 'key3': 'serf', 'key4': 622144}, # не уникален, у эл-тов с индеками 1 и 9 такие же значения: {'key1': 'beagle', 'key2': 'cloistral', 'key3': 'close', 'key4': 77}, # не уникален, у эл-тов с индексами 1 и 8 такие же значения: {'key1': 'beagle', 'key2': 'cloistral', 'key3': 'close', 'key4': 253}, ]
Отредактировано driveman (Апрель 19, 2018 15:54:02)
Офлайн
примерно так
>>> l = [ {'key1': 'home', 'key2': 'word', 'key3': 'that', 'key4': 842268745}, {'key1': 'secret', 'key2': 'terrible', 'key3': 'phone', 'key4': 654}, # не уникален, у эл-та с индексом 3 такие же значения {'key1': 'aback', 'key2': 'tippy', 'key3': 'fireworks', 'key4': 123}, {'key1': 'secret', 'key2': 'terrible', 'key3': 'phone', 'key4': 23689633}, # не уникален, у эл-та с индексом 1 такие же значения {'key1': 'murage', 'key2': 'sweep', 'key3': 'transmit', 'key4': 9875}, {'key1': 'beagle', 'key2': 'cloistral', 'key3': 'close', 'key4': 632125}, # не уникален, у эл-тов с индексами 8 и 9 такие же значения {'key1': 'cognitive', 'key2': 'coin', 'key3': 'jubilant', 'key4': 96}, {'key1': 'keel', 'key2': 'lately', 'key3': 'serf', 'key4': 622144}, {'key1': 'beagle', 'key2': 'cloistral', 'key3': 'close', 'key4': 77}, # не уникален, у эл-тов с индеками 1 и 9 такие же значения {'key1': 'beagle', 'key2': 'cloistral', 'key3': 'close', 'key4': 253}, # не уникален, у эл-тов с индексами 1 и 8 такие же значения ] >>> lst = sorted([list(i.items()) for i in l]) >>> from itertools import groupby >>> g = groupby(lst,key = lambda x: (x[0],x[1],x[2])) >>> for k,v in g: l = list(v) if len(l) > 1: print(l) [[('key1', 'beagle'), ('key2', 'cloistral'), ('key3', 'close'), ('key4', 77)], [('key1', 'beagle'), ('key2', 'cloistral'), ('key3', 'close'), ('key4', 253)], [('key1', 'beagle'), ('key2', 'cloistral'), ('key3', 'close'), ('key4', 632125)]] [[('key1', 'secret'), ('key2', 'terrible'), ('key3', 'phone'), ('key4', 654)], [('key1', 'secret'), ('key2', 'terrible'), ('key3', 'phone'), ('key4', 23689633)]] >>>
Офлайн
vic57Не получается. Дело в том, что вот эта строка:
примерно так
groupby(lst,key = lambda x: (x[0],x[1],x[2]))
l = [ {'key1': 'home', 'key2': 'word', 'key3': 'that', 'key4': 842268745}, # не уникален, у эл-та с индексом 3 такие же значения: {'key1': 'secret', 'key2': 'terrible', 'key3': 'phone', 'key4': 654}, {'key1': 'aback', 'key2': 'tippy', 'key3': 'fireworks', 'key4': 123}, # не уникален, у эл-та с индексом 1 такие же значения: {'key1': 'secret', 'key2': 'terrible', 'key3': 'phone', 'key4': 23689633}, {'key1': 'murage', 'key2': 'sweep', 'key3': 'transmit', 'key4': 9875}, # не уникален, у эл-тов с индексами 8 и 9 такие же значения: {'key1': 'beagle', 'key2': 'cloistral', 'key3': 'close', 'key4': 632125}, {'key1': 'cognitive', 'key2': 'coin', 'key3': 'jubilant', 'key4': 96}, {'key1': 'keel', 'key2': 'lately', 'key3': 'serf', 'key4': 622144}, # не уникален, у эл-тов с индеками 1 и 9 такие же значения: {'key1': 'beagle', 'key2': 'cloistral', 'key3': 'close', 'key4': 77}, # не уникален, у эл-тов с индексами 1 и 8 такие же значения: {'key1': 'beagle', 'key2': 'cloistral', 'key3': 'close', 'key4': 253}, ] lst = sorted([list(i.items()) for i in l]) for elem in lst: print(elem)
[('key1', 'aback'), ('key2', 'tippy'), ('key4', 123), ('key3', 'fireworks')] [('key1', 'beagle'), ('key2', 'cloistral'), ('key4', 77), ('key3', 'close')] [('key1', 'beagle'), ('key2', 'cloistral'), ('key4', 253), ('key3', 'close')] [('key1', 'beagle'), ('key2', 'cloistral'), ('key4', 632125), ('key3', 'close')] [('key1', 'cognitive'), ('key2', 'coin'), ('key4', 96), ('key3', 'jubilant')] [('key1', 'home'), ('key2', 'word'), ('key4', 842268745), ('key3', 'that')] [('key1', 'keel'), ('key2', 'lately'), ('key4', 622144), ('key3', 'serf')] [('key1', 'murage'), ('key2', 'sweep'), ('key4', 9875), ('key3', 'transmit')] [('key1', 'secret'), ('key2', 'terrible'), ('key4', 654), ('key3', 'phone')] [('key1', 'secret'), ('key2', 'terrible'), ('key4', 23689633), ('key3', 'phone')]
[('key3', 'close'), ('key1', 'beagle'), ('key4', 77), ('key2', 'cloistral')] [('key3', 'close'), ('key1', 'beagle'), ('key4', 253), ('key2', 'cloistral')] [('key3', 'close'), ('key1', 'beagle'), ('key4', 632125), ('key2', 'cloistral')] [('key3', 'fireworks'), ('key1', 'aback'), ('key4', 123), ('key2', 'tippy')] [('key3', 'jubilant'), ('key1', 'cognitive'), ('key4', 96), ('key2', 'coin')] [('key3', 'phone'), ('key1', 'secret'), ('key4', 654), ('key2', 'terrible')] [('key3', 'phone'), ('key1', 'secret'), ('key4', 23689633), ('key2', 'terrible')] [('key3', 'serf'), ('key1', 'keel'), ('key4', 622144), ('key2', 'lately')] [('key3', 'that'), ('key1', 'home'), ('key4', 842268745), ('key2', 'word')] [('key3', 'transmit'), ('key1', 'murage'), ('key4', 9875), ('key2', 'sweep')]
Офлайн
формат был тот какой вы дали
решаемо рекурсией сортировка->группировка
>>> d = {'k1':'v4','k4':'v3','k3':'v2','k2':'v1',} >>> sorted(d.items(),key=lambda x: x[0]) [('k1', 'v4'), ('k2', 'v1'), ('k3', 'v2'), ('k4', 'v3')] >>> sorted(d.items(),key=lambda x: x[1]) [('k2', 'v1'), ('k3', 'v2'), ('k4', 'v3'), ('k1', 'v4')] >>>
>>> lst = sorted(sorted(i.items(),key=lambda x:x[0]) for i in l])
Отредактировано vic57 (Апрель 19, 2018 19:00:47)
Офлайн
drivemanНадо сделать функцию, которая принимает список элементов и возвращает n-ки индексов вхождений.
Несмотря на то, что теоретически элементы должны быть уникальными - на практике это может быть не так.
Офлайн
У меня есть подозрение что вы неправильно построили структуру данных.
Почему бы вам не организовать ее так:
key4 = { ( 'home', 'word','that'): 842268745, ( 'secret', 'terrible','phone'): 654, .... }
Отредактировано doza_and (Апрель 20, 2018 07:36:58)
Офлайн