如何将列表的列表转换为列表值中每个字典的列表?

时间:2018-03-17 21:13:07

标签: python mongodb dictionary list-comprehension

我正在尝试生成一个类别列表,我可以将其传递给我的html模板,以呈现所有类别的导航栏。在我的mongo数据库的产品集中,每个产品都有一个类别字段。使用下面的代码我生成所有类别的pymongo游标。

categories = Database.DATABASE[ProductConstants.COLLECTION].find({}, {'category': True, '_id': False})

print(categories)
<pymongo.cursor.Cursor at 0x1049cc668>

将类别放在列表中会给我

categories = list(categories)

print(categories)

[{'category': 'Phones'},
 {'category': 'Phones'},
 {'category': 'Phones'},
 {'category': 'Phones'},
 {'category': 'Phones'},
 {'category': 'Soaps'}]

这似乎是朝着正确方向迈出的一步。我希望类别的结束输出只是:

print(categories)

['Phones', 'Soaps']. 

我试过这样做:

categories = [category.values() for category in categories]
print(categories)

[dict_values(['Phones']),
 dict_values(['Phones']),
 dict_values(['Phones']),
 dict_values(['Phones']),
 dict_values(['Soaps'])]

如果我可以摆脱dict_values,我可以使用sum(categories,[])来展平这个列表,然后把它放到一个set()中,这样我就没有任何重复。我相信这会给我想要的结果,但我不知道如何去做。也许我走的是错误的路线,有更好的方法可以解决所有这些问题?建议将不胜感激。

2 个答案:

答案 0 :(得分:3)

听起来你需要一组类别:

categories = [{'category': 'Phones'},
 {'category': 'Phones'},
 {'category': 'Phones'},
 {'category': 'Phones'},
 {'category': 'Phones'},
 {'category': 'Soaps'}]


# use a set to eliminate the duplicate categories
c = set(d['category'] for d in categories)
print(list(c))

输出:

['Soaps', 'Phones']

<强>更新

c = {d['category'] for d in categories} # equivalent using a set comprehension

答案 1 :(得分:2)

试试这个

categories = Database.DATABASE[ProductConstants.COLLECTION].find({}, {'category': True, '_id': False}).distinct('category')


print categories

此类别列表将包含不同数量的类别值。