2014-03-05 50 views
0

我有2个字典;如何比较2个元组字典来生成这个字典列表?

Dict1={'John': ('AA', 'BB'), 'Tom': ('XX', 'YY'), 'Jane': ('AA', 'BB')} 

Dict2={'John': ('CC', 'DD', '2'), 'Tom': ('CC', 'DD', '1'), 'Jack': ('CC', 'DD', '3')} 

基于这两个列表,我想生成一个看起来像这样的字典;

OutputDict={'John': ('AA', 'BB', '2'), 'Tom': ('XX', 'YY', '1')} 

它是如何工作的,

  1. 检查Dict1和Dict2中的字典是否有匹配的键。
  2. 如果它们具有匹配的键,则将Dict2中的元组的第3个元素复制并粘贴到Dict1中相应的字典中以生成OutputDict。

这怎么可以在Python中完成?我正在使用Python2.7。

+3

既然你描述了算法,为什么你不向我们展示你尝试过的Python代码? – 2014-03-05 10:47:51

回答

2

的直向前溶液是这样的,类似到其他答案:

outputDict = {} 
for k, v in dict1.items(): 
    if k in dict2: 
     result[k] = v + (dict2[k][2],) 

由于这个问题相当简单,一个(可以说)更Python的方式可以利用字典理解的,而不两不误可读性:

outputDict = {k: v + (dict2[k][2],) for k, v in dict1.items() if k in dict2} 

我也建议使用LOWER_CASE或驼峰命名变量,按PEP 8 Style Guide,保留UpperCase类的名字。

+0

我喜欢pythonic解决方法问题。这是pythonic的方式,让我卡住了。 – user781486

2

有多种方式做你正在尝试做的,一个最简单的将是如下:

OutputDict = {} 
for key in Dict1.iterkeys(): 
    if key in Dict2: 
     OutputDict[key] = Dict1[key] + Dict2[key][2] 

因为所有的操作都是O(1),并且可以运行它的每个按键Dict1(或Dict2取决于)这一切运行在O(分钟(N,M)),其中n是Dict1的长度和m Dict2

的长度
+0

如果你不使用它,为什么要迭代'value'?也许只是'键入Dict1'就行了。另外,你正在加2,而OP想要第二个元素的值。 –

+0

绝对正确:) –

+0

为了获得O(min(n,m))的复杂度,你不应该先确定两个词典中的哪一个更小吗?这可能是暗示的,但这样做只会添加一行代码(以及其他地方的一些更改),如“d1,d2 = sorted([Dict1,Dict2],key = len)” – Nuclearman

3
>>> Dict1={'John': ('AA', 'BB'), 'Tom': ('XX', 'YY'), 'Jane': ('AA', 'BB')} 
>>> Dict2={'John': ('CC', 'DD', '2'), 'Tom': ('CC', 'DD', '1'), 'Jack': ('CC', 'DD', '3')} 
>>> OutputDict = {} 
>>> for k in Dict1: 
...  if k in Dict2.keys(): 
...   OutputDict[k] = tuple(Dict1[k]) + tuple(Dict2[k][2]) 
... 
>>> OutputDict 
{'John': ('AA', 'BB', '2'), 'Tom': ('XX', 'YY', '1')}