我有两个列表如下:
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吗?
答案 0 :(得分:1)
你的问题很模糊,但我认为这正是你要找的。 p>
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'}