Реализация «выберите отличное ... от ...» из списка словарей Python - PullRequest
1 голос
/ 05 мая 2010

Вот моя проблема: у меня есть список словарей Python идентичной формы, предназначенных для представления строк таблицы в базе данных, что-то вроде этого:

[ {'ID': 1,
   'NAME': 'Joe',
   'CLASS': '8th',
   ... },
  {'ID': 1,
   'NAME': 'Joe',
   'CLASS': '11th',
   ... },
  ...]

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

select distinct NAME from ...

Однако я хочу иметь возможность получить список из нескольких уникальных полей, аналогично:

select distinct NAME, CLASS from ...

Что я нахожу нетривиальным. Есть ли алгоритм или Python включенная функция, чтобы помочь мне с этим затруднительным положением?

Прежде чем предложить загрузить файлы CSV в таблицу SQLite или что-то подобное, это не вариант для среды, в которой я нахожусь, и, поверьте мне, это была моя первая мысль.

Ответы [ 3 ]

9 голосов
/ 05 мая 2010

Если вы хотите его в качестве генератора:

def select_distinct(dictionaries, keys):
  seen = set()
  for d in dictionaries:
    v = tuple(d[k] for k in keys)
    if v in seen: continue
    yield v
    seen.add(v)

если вы хотите получить результат в какой-либо другой форме (например, список вместо генератора), нетрудно изменить его (например, .append на изначально пустой список результатов вместо yield ing и вернуть список результатов в конце).

Называться, конечно, как

for values_tuple in select_distinct(thedicts, ('NAME', 'CLASS')):
    ...

или тому подобное.

0 голосов
/ 21 апреля 2014

Можно реализовать задачу с помощью хеширования.Просто хешируйте содержимое строк, которые появляются в отдельном запросе, и игнорируйте те, у которых такой же хеш.

0 голосов
/ 05 мая 2010

different_list = список (набор ([(d ['NAME'], d ['CLASS']) для d в списке строк]))

где row_list - список ваших диктов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...