2012-06-01 107 views
2

我有一个列表,我需要将其制作成字典。该列表具有重复(即将成为)具有不同值的键。我如何找到这些键并将新值添加到它?如果键已经存在,将值附加到键(python/jython)

list=[q:1,w:2,q:7] 
dictionary= q:1,7 
      w:2 

在此先感谢

+2

列表通常不具有键值对。你的列表是由元组还是其他?此外,你想以什么方式明确地将值附加到其他值 - 你是否将它们视为字符串?因为你的例子表明他们被视为整数。 –

回答

9

请在你的字典列表中的值,让你有:

dictionary = {'q': [1, 7], 
       'w': [2] 
} 

等即你的一个项的值是一个项目列表。这意味着,当你有另一'q',你可以这样做:

dictionary['q'].append(5) 

dictionary['q']将是一个KeyError你第一次做,所以使用setdefault代替:

dictionary.setdefault('q', []).append(5) 

所以,现在你只需需要迭代输入列表中的每个键和值对,并对它们中的每一个进行上述操作。

你可能或者想拥有dictionary是:

dictionary = collections.defaultdict(list) 

所以,你可以做dictionary['q'].append(5) - 它将工作与上述相同,在各方面的酒吧之一。如果,你已经解析您的原始清单,并正确设置所有的值之后,你的字典是这样的:

dictionary = {'q': [1, 7, 5] 
       'w': [2, 8, 10, 80] 
       'x': [3] 
} 

,并尝试做print(dictionary['y'])。你期望发生什么?如果您使用正常的字典和setdefault,这被认为是一个错误,所以它会提高KeyError。如果您使用defaultdict,它将打印一个空列表。无论哪种方法对你的代码更有意义都应该决定你编码的方式。

+2

更好的是,使用'collections.defaultdict(list)' - 然后你可以像使用普通字典一样分配或查找。 –

+0

@DavidRobinson在这种情况下'defaultdict'是否优于setdefault是有争议的。当工厂功能昂贵时,他们的主要好处就来了 - 但建立一个空的清单并不是。 – lvc

+0

我认为这对代码紧凑有利。您只需定义一次字典,但可能会在代码中多次获取或设置值。 –

相关问题