尝试创建一个包含每个团队每个球员的姓名,位置和编号的字典。但是,当尝试创建最终字典exports.addUser = functions.https.onRequest(async (request:any,response:any) => {
// read parameters from request
const name = request.query.name
const token = request.query.token
const data = {
name: name,
age: 30,
token: token
}
// use add if no doc-ID is specified else use set
const idUser = (await db.collection(collectionUser).add(data)).id
const newData = {
idUser: idUser,
}
const userRef = db.collection(collectionUser).doc(idUser)
await userRef.update(newData)
const newUserRef = await userRef.get()
response.send(newUserRef.data())
})
时,它将引发错误(请参见下文)。我似乎做得不好,对我在这里做错的任何想法都会受到赞赏。非常感谢,
players[team_name] =dict(zip(number,name,position))
答案 0 :(得分:1)
您无法实例化带有3个参数的dict
,问题在于您要在zip
中使用3个变量来实例化{{ 1}},您一次只能输入2个参数,即键和值
我已经重写了您的部分代码:
zip(number, name, position)
输出:
dict
答案 1 :(得分:1)
您的代码中有很多问题。导致该错误的一个原因是您试图实例化列表中具有3个项目元组的字典,这是不可能的。有关详细信息,请参见the dict doc。
也就是说,我建议重做整个嵌套循环。
首先,您在clud_ele
中有一个玩家信息列表,每个玩家信息仅涉及一个玩家,并且仅提供一个位置,一个名字和一个号码。因此,无需将这些信息存储在列表中,您可以使用简单的变量:
for player_info in clud_ele:
number = player_info.select('span.number')[0].get_text(strip=True)
if number == '-':
number = 100
name = player_info.select('h4.name')[0].get_text(strip=True)
position = player_info.select('span.position')[0].get_text(strip=True)
在这里,使用select
方法将返回一个列表,但是由于您知道该列表仅包含一项,因此可以使该项目调用get_text
。但是,如果要确保...,可以先检查player_info.select('span.number')
的长度实际上是否为1,然后再继续工作...
这样,您将获得易于处理的标量数据类型。
另外请注意,我将i
重命名为player_info
,这更加明确。
然后,您可以轻松地将播放器数据添加到players
字典中:
players[team_name].append({'name': name,
'position': position
'number': number})
假设您在players[team_name]
嵌套循环之前创建了players[team_name] = []
。
编辑:如@kederrac's answer中所述,使用defaultdict
是避免手动创建每个players[team_name]
列表的聪明又方便的方法 < / p>
最后,这将为您提供:
name
,position
和number
键值的字典team_name
的球队名单相关联这是您似乎想要的数据结构,但是其他结构也是可能的。记住要考虑一下您的数据结构,使其逻辑合理且易于操作。