我有一个用户列表users["pirates"]
,它们以['pirate1','pirate2']
格式存储。
如果我将列表移交给def并在MongoDB中查询它,它只返回基于第一个索引(例如pirate1)的数据。如果我以["pirate1","pirate"]
格式移交列表,它将根据列表中的所有元素返回数据。所以我认为列表中元素的封装有问题。我的问题:我可以将封装从'更改为'而不用手动循环替换每个元素上的每个元素吗?
简短示例:
aList = list()
# get pirate Stuff
# users["pirates"] is a list returned by a former query
# so e.g. users["pirates"][0] may be peter without any quotes
for pirate in users["pirates"]:
aList.append(pirate)
aVar = pirateDef(aList)
print(aVar)
定义:
def pirateDef(inputList = list()):
# prepare query
col = mongoConnect().MYCOL
# query for pirates Arrrr
pirates = col.find({ "_id" : {"$in" : inputList}}
).sort("_id",1).limit(50)
# loop over users
userList = list()
for person in pirates:
# do stuff that has nothing to do with the problem
# append user to userlist
userList.append(person)
return userList
如果给定列表具有'封装,则返回:
'pirates': [{'pirate': 'Arrr', '_id': 'blabla'}]
如果用“它返回:
封装'pirates' : [{'_id': 'blabla', 'pirate' : 'Arrr'}, {'_id': 'blabla2', 'pirate' : 'cheers'}]
编辑:我试图搞清楚,问题必须在MongoDB查询中。该列表正确地移交给Def,但在查询后,盗版只包含1个元素......
编辑2:原来问题是错误的输入与数据库中的数据不匹配(讨厌这些错误,导致它们很简单但很难理解:-))我会的很快就删除了这篇文章。
编辑3:该死的...无法删除: - (
感谢您的帮助
Codehai
答案 0 :(得分:2)
这是您的首次上市:
aList = list()
# get pirate Stuff
# users["pirates"] is a list returned by a former query
# so e.g. users["pirates"][0] may be peter without any quotes
for pirate in users["pirates"]:
aList.append(pirate)
aVar = pirateDef(aList)
相当于:
aList = list(users["pirates"])
aVar = pirateDef(aList)
除非您的商家信息在pirateDef
中的每个项目中调用users["pirates"]
,且中间值为aList
。
您的第二个列表在语法上是不正确的,因为它的缩进不正确。我假设你的意思是列表中的所有内容都缩进,以便它是pirateDef
主体的一部分。
让我们依次谈谈这一行:
def pirateDef(inputList = list()):
首先,这个名字太可怕了。函数名称通常应指示函数的功能,并且永远不会有“def”。其次,参数列表(inputList = list())
指定在函数创建时 python应该创建一个特定的列表对象,并将其分配给变量inputList
。如果您的函数修改了inputList
,则这些修改将在调用函数pirateDef
时保持不变。
通常情况下使用一些不可变的东西,通常是None
,并在函数本身内测试它。
# prepare query
col = mongoConnect().MYCOL
# query for pirates Arrrr
pirates = col.find({ "_id" : {"$in" : inputList}}
).sort("_id",1).limit(50)
我对mongo一无所知,所以我对这些内容没有任何评论。
# loop over users
userList = list()
for person in pirates:
# do stuff that has nothing to do with the problem
# append user to userlist
userList.append(person)
这些行等同于userList = list(pirates)
。
return userList
鉴于您对userList
没有采取任何措施,您可能刚刚返回list(pirates)
。但是鉴于除了检索它之外你没有对pirates
做任何事情,你可以回复它。
因此,您的功能将变为:
def pirateDef(inputList = None):
if not inputList:
inputList = []
# prepare query
col = mongoConnect().MYCOL
# query for pirates Arrrr
return col.find({ "_id" : {"$in" : inputList}}
).sort("_id",1).limit(50)
我意识到这可能无法解决你的问题,这无疑与你如何查询mongo有关。