创建一个包含未知密钥的字典并为其附加一个列表值?

时间:2017-12-26 13:33:57

标签: python list dictionary

我希望能够遍历游戏中的所有对象并检查他们的self.owner统计数据。

为此,我这样做:

for ship in game_map._all_ships():
     ....

我想创建一个字典,其中键作为玩家和船只的值列表:

dictionary { 'Player 0' :[ship 1, ship 2], 'Player 1': [ship 1] ... etc}

我可以用

检索他们的播放器
ship.owner

但我不知道如何用列表初始化字典,而不知道有多少玩家,或者没有先运行循环就有多少艘船。

3 个答案:

答案 0 :(得分:1)

试试这个:

# create an empty dictionary
mydictionary = {}
# loop through all ship objects
for ship in game_map._all_ships():
    # check if there's not list yet for the ship owner
    if ship.owner not in mydictionary:
        # if no such list exists yet, create it with an empty list
        mydictionary[ship.owner] = []
    # with the ship owner name as key, extend the list with the new ship
    mydictionary[ship.owner].append(ship)

答案 1 :(得分:1)

最顺畅的方法使用collections.defaultdict以避免检查密钥:

from collections import defaultdict

dic = defaultdict(list)
for ship in game_map._all_ships():
    dic[ship.owner].append(ship)

答案 2 :(得分:0)

这里需要的是defaultdict,一个围绕dict的包装类,它提供了所有基本字典功能,并允许创建空值键值对。

Pydoc将其定义为:

  

class collections.defaultdict([default_factory [,...]])

     

返回一个新的类字典对象。 defaultdict是内置字典的子类   类。它会覆盖一个方法并添加一个可写实例   变量。其余功能与dict相同   类,这里没有记录。

     

第一个参数提供default_factory的初始值   属性;它默认为None。所有剩余的参数都被处理   就像它们传递给dict构造函数一样,包括   关键字参数。

小示例代码:

>>> from collections import defaultdict

# create defaultdict containing values of `list` type
>>> d = defaultdict(list)
>>> d
=> defaultdict(<class 'list'>, {})

# assuming we need to add list `l` value to the dictionary with key 'l'
>>> l = [1,2,3]
>>> for ele in l: 
        d['l'].append(ele)    

>>> d
=> defaultdict(<class 'list'>, {'l': [1, 2, 3]})