-1

我有一个用户列表,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,但在查询 pirates 后仅包含 1 个元素...

编辑2:原来问题是错误的输入与数据库中的数据不匹配(讨厌这些错误,因为它们很简单但很难理解:-))我很快就会删除这篇文章。

编辑3:该死的..不能删除:-(

谢谢你帮助我

码海

4

1 回答 1

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 的方式有关。

于 2013-10-17T21:51:21.123 回答