gpt4 book ai didi

python - 遍历字典以创建列表

转载 作者:IT老高 更新时间:2023-10-28 12:32:04 26 4
gpt4 key购买 nike

我在名为 favoriteColors 的 MongoDB 集合中有以下 4 个字典:

{ "name" : "Johnny", "color" : "green" }
{ "name" : "Steve", "color" : "blue" },
{ "name" : "Ben", "color" : "red" },
{ "name" : "Timmy", "color" : "cyan" }

我正在尝试创建与不同有序列表匹配的颜色值的有序列表。

例如,如果我有列表 ["Johnny", "Steve", "Ben", "Johnny"] 新列表将 ["green", "blue", "红色", "绿色"].

如果我有列表 ["Steve", "Steve", "Ben", "Ben", "Johnny"] 新列表将是 ["blue", “蓝色”、“红色”、“红色”、“绿色”].

使用 Python 和/或 PyMongo 有什么好的方法。这是我到目前为止所拥有的,但它无法识别重复项。

name_list = ["Steve", "Steve", "Ben", "Ben", "Johnny"]

color_list = []
for document in db.favoriteColors.aggregate([
{"$match": {"name": {"$in": name_list }}},
{"$project": {"color": 1}}
]):
for k, v in document.iteritems():
color_list.append(v)

print color_list
# ["blue", "red", "green"]

最佳答案

实际上,我们可以使用带有客户端处理的聚合框架来有效地做到这一点。

import pymongo


client = pymongo.MongoClient()
db = client.test # Or whatever is your database
favoriteColors = db.favoriteColors
first_list = ['Johnny', 'Steve', 'Ben', 'Johnny']

cursor = favoriteColors.aggregate([
{'$match': {'name': {'$in': first_list}}},
{'$project': {'part': {'$map': {
'input': first_list,
'as': 'inp',
'in': {
'$cond': [
{'$eq': [ '$$inp', '$name']},
'$color',
None
]
}
}}}},
{'$group': {'_id': None, 'data': {'$push': '$part'}}}
])

因为我们$group通过 None,我们的光标包含一个文档,我们可以使用 next 检索该文档。事实上,我们可以通过 print(list(cursor))

来验证
>>> import pprint
>>> pprint.pprint(list(cursor))
[{'_id': None,
'data': [['green', None, None, 'green'],
[None, 'blue', None, None],
[None, None, 'red', None]]}]

从这里开始,我们需要解包文档中的“数据”字段为zip , 使用 chain.from_iterable 链接输入并过滤掉 None 的元素。

from itertools import chain

result = [item
for item in chain.from_iterable(zip(*next(cursor)['data']))
if item is not None]

返回:

>>> result
['green', 'blue', 'red', 'green']

关于python - 遍历字典以创建列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41272083/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com