在Python词典列表中实现“select distinct ... from ...”

时间:2010-05-05 17:48:17

标签: python algorithm

这是我的问题:我有一个相同形式的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 个答案:

答案 0 :(得分:9)

如果你想把它作为一个发电机:

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')):
    ...

等。

答案 1 :(得分:0)

distinct_list = list(set([(d ['NAME'],d ['CLASS'])for row_list])))

其中row_list是您拥有的词组列表

答案 2 :(得分:0)

可以使用散列来实现任务。只需对不同查询中出现的行的内容进行哈希处理,然后忽略具有相同哈希值的行。