当一个键在python中有两个值时,创建一个包含两个列表的字典

时间:2017-11-17 05:54:04

标签: python list dictionary

嗨我有两个清单,

list1
['PO', 'NA', 'PO']

list2
['Post Office', 'Not Available', 'Post area']

我试图使用这两个列表来获取字典 我试过了,my_dict=dict(zip(list1,list2)) 它给了,

 {'NA': 'Not Available', 'PO': 'Post area'}

但我的预期输出是,

 {'NA': 'Not Available', 'PO': ['Post area','Post Office']}

请帮助

5 个答案:

答案 0 :(得分:3)

您可以使用dict

定义自己的自定义dict类
class ListDict(dict):
    def __init__(self, d={}):
        if isinstance(d, zip):
            for i, v in enumerate(d):
                self.__setattr__(v[0], v[1])
        else:
            self.update(d)

    def __setattr__(self, key, val):
        if key in self:
            if not isinstance(self[key], list):
                self[key] = [self[key]]
            self[key].append(val)
        else:
            self[key] = val


list1 = ['PO', 'NA', 'PO']
list2 = ['Post Office', 'Not Available', 'Post area']
my_dict = ListDict(zip(list1, list2))
print(my_dict)

输出:

{'PO': ['Post Office', 'Post area'], 'NA': 'Not Available'}

答案 1 :(得分:1)

有两种方法:

  

使用defaultdict的第一种方法:

from collections import defaultdict

list1=['PO', 'NA', 'PO']

list2=['Post Office', 'Not Available', 'Post area']

final_dict = defaultdict(list)

[final_dict[item[0]].append(item[1]) for item in zip(list1,list2)]
print(final_dict)

输出:

defaultdict(<class 'list'>, {'PO': ['Post Office', 'Post area'], 'NA': ['Not Available']})
  

第二种方法:

让我们分两步解决您的问题:

  

首先压缩两个列表:

list1=['PO', 'NA', 'PO']

list2=['Post Office', 'Not Available', 'Post area']

zip_list=[item for item in zip(list1,list2)]
  

现在检查zip tuple first element是否在dict中,如果是的话   使用这个很棒的模式:

final_dict={}
    for item in zip_list:
        if item[0] not in final_dict:
            final_dict[item[0]]=[item[1]]
        else:
            final_dict[item[0]].append(item[1])
  

完整代码:

list1=['PO', 'NA', 'PO']

list2=['Post Office', 'Not Available', 'Post area']

zip_list=[item for item in zip(list1,list2)]
final_dict={}
for item in zip_list:
    if item[0] not in final_dict:
        final_dict[item[0]]=[item[1]]
    else:
        final_dict[item[0]].append(item[1])

print(final_dict)

输出:

{'NA': ['Not Available'], 'PO': ['Post Office', 'Post area']}

答案 2 :(得分:1)

这可能不是您想要的,因为它为您提供单个缩写的列表,但它提供的输出与您正在寻找的输出非常相似。 我希望它有所帮助。

list1 = ['PO', 'NA', 'PO']
list2 = ['Post Office', 'Not Available', 'Post area']

my_dict = {}

for abbrev,value in zip(list1,list2):
    if abbrev in my_dict.keys():
        my_dict[abbrev] += [value]
    else:
        my_dict[abbrev] = [value]

编辑:为了完整起见,下面的代码不会为单个项目创建列表,并且可以使用包含多个匹配项的大型项目列表正常运行。

list1 = ['PO', 'NA', 'PO']
list2 = ['Post Office', 'Not Available', 'Post area']

my_dict = {}

for abbrev,value in zip(list1,list2):
    if abbrev in my_dict.keys():
        if isinstance(my_dict[abbrev],str):
            my_dict[abbrev] = [my_dict[abbrev]]
        my_dict[abbrev] += [value]
    else:
        my_dict[abbrev] = value

print(my_dict)

答案 3 :(得分:1)

list1 = ['PO', 'NA', 'PO']
list2 = ['Post Office', 'Not Available', 'Post area']

my_dict = dict()
for key,value in zip(list1,list2):
    if key not in my_dict:
        my_dict[key] = value
    else:
        my_dict[key] = [my_dict[key]]
        my_dict[key].append(value)

print(my_dict)

答案 4 :(得分:0)

我认为它对你也很有用。

list1 = ['PO', 'NA', 'PO', 'TCS', 'TCS']
list2 = ['Post Office', 'Not Available', 'Post area', 'Track Complaint Status', 'Tata Consultancy Service', 'Tata Consultancy Service']

output_dict = {}

for index, value in enumerate(list1):
     if not value in output_dict:
          output_dict.update({value:list2[index]})
     else:
          temp_list = [list2[index]]
          temp_list.append(output_dict[value])
          output_dict.update({value:temp_list})
 print(output_dict)

输出: - {&#39; NA&#39;:&#39;不可用&#39;,&#39; PO&#39;:[&#39;发布区域&# 39;,&#39; Post Office&#39;],&#39; TCS&#39;:[&#39; Tata Consultancy Service&#39;,&#39; Tata Consultancy Service&#39;]}

在此程序中,无论list2中的重复值和长度也是如此。您可以根据确切的问题修改此代码。