封装在python列表中(想要使用“而不是')

时间:2013-10-17 21:05:23

标签: python list mongodb

我有一个用户列表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

1 个答案:

答案 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有关。