使用两个列表生成字典

2024-04-20 09:42:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两张这样的单子:

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

我有以下功能

def genOneDic(dic1, dic2):

我想做一些事情,如返回一个单一的dic连接,如

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) 

应返回get仅获取listA中的字段。现在加入listA和listB时都有一个“g”,但它们在单个dic中应该是不同的。应该有两个g。最好的解决方案是在钥匙上预先加上dic1或dic2,然后连接dic吗?你知道吗


Tags: 方法in功能forgetdef事情dict
2条回答

下面是如何创建跳过两个列表中重叠键的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}

然后重用设置的交点为重叠的关键点创建两个关键点。在这一步中,由于集合是无序的,您可能会使重叠中某些键的顺序松动:

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}

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

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'}

你的问题含糊不清,但我想这就是你要找的。你知道吗

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

相关问题 更多 >