如何在循环中将键和值添加到字典?

时间:2020-02-01 17:40:44

标签: python dictionary

尝试创建一个包含每个团队每个球员的姓名,位置和编号的字典。但是,当尝试创建最终字典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))

2 个答案:

答案 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>

最后,这将为您提供:

  • 包含每个玩家的namepositionnumber键值的字典
  • 球队名单中包含每个球队的球员字典
  • 玩家字典,将每个team_name的球队名单相关联

这是您似乎想要的数据结构,但是其他结构也是可能的。记住要考虑一下您的数据结构,使其逻辑合理且易于操作。