使用两个列表生成字典

时间:2014-02-21 20:49:40

标签: python dictionary

我有两个列表如下:

listA = [a, b, c, d, e, f, g]
listB = [g, h, i, j, k, l]

我有以下功能

def genOneDic(dic1, dic2):

我想做一些像返回一个像

这样的联合单词
dict(( e, dic1.get(e)) for e in listA) + dict(( e, dic2.get(e)) for e in listB)

那似乎不对,这样做的正确方法是什么?

使用dic1

的示例
dic1 = {'a':'1', 'b':'2', 'c':'3', 'd':'4', 'e':'5', 'f':'6', 'x':'10', 'z':'11'}
listA = ['a', 'b', 'c', 'd', 'e', 'f']
dict(( e, dic1.get(e)) for e in listA) 

应该返回只获取listA中的字段。现在加入listA和listB时都有一个'g',但它们在单个dic中应该是不同的。应该有两个'g'。最好的解决方案是将dic1或dic2添加到密钥并加入dic吗?

2 个答案:

答案 0 :(得分:1)

你的问题很模糊,但我认为这正是你要找的。

first = {k: dic1.get(k) for k in listA }
second = {k: dic2.get(k) for k in listB } 
first.update(second)

答案 1 :(得分:1)

以下是如何创建一个跳过两个列表中重叠键的dict。

使用set intersection查找两个列表中的键:

listA = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
listB = ['g', 'h', 'i', 'j', 'k', 'l']

di={k:v for v,k in enumerate(listA,1) if k not in set(listA) & set(listB)}
i=max(di.values())
di.update({k:v for v,k in enumerate(listB,i) if k not in set(listA) & set(listB)})
i=max(di.values())

print di
# {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'f': 6, 'i': 8, 'h': 7, 'k': 10, 'j': 9, 'l': 11}

然后重复使用set intersection为重叠键创建两个键。在此步骤中,您可能会松开重叠中某些键的顺序,因为集合是无序的:

for e in set(listA) & set(listB):
    di['listA.'+e]=max(di.values())+1
    di['listB.'+e]=max(di.values())+1

print di
# {'a': 1, 'listB.g': 13, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'f': 6, 'i': 8, 'h': 7, 'k': 10, 'j': 9, 'l': 11, 'listA.g': 12}

您可以使用相同的技术交错两个列表和词组:

listA = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
listB = ['g', 'h', 'i', 'j', 'k', 'l']
dic1 = {'a':'1', 'b':'2', 'c':'3', 'd':'4', 'e':'5', 'f':'6', 'g':'10', 'z':'11'}
dic2 = {'g':'55', 'h':'56', 'i':'56', 'j':'57', 'k':'58', 'l':'59', 'x':'10', 'z':'11'}

di={k:dic1.get(k, None) for k in listA if k not in set(listA) & set(listB)}
di.update({k:dic2.get(k, None) for k in listB if k in set(listB)-set(listA) and k not in set(listA) & set(listB)})

for e in set(listA) & set(listB):
    di['dic1.'+e]=dic1.get(e, None)
    di['dic2.'+e]=dic2.get(e, None)

print di
# {'a': '1', 'c': '3', 'b': '2', 'e': '5', 'd': '4', 
   'f': '6', 'i': '56', 'h': '56', 'k': '58', 'j': '57', 
   'l': '59', 'dic1.g': '10', 'dic2.g': '55'}