首页 > 解决方案 > 如何从列表和列表列表中制作字典

问题描述

我有两个清单。一个只包含单个值,另一个包含列表。第一个列表的值几乎总是(但不总是)与列表列表的每个列表的 0 位置的值相同。

List1 = [ "abcd", "efg", "hijk"]
List2 = [ ["abcd", "hello", "world"],
          ["efg", "My name's", "Tom"], 
          ["hijk", "I", "Love you"]

我想用 list1 中的键和 list2 中的值制作一个字典:

Dict = {"abcd": ["hello", "world"], 
        "efg": ["My name's", "Tom"], 
        "hijk": ["I", "Love you"]}

我尝试这样做,但没有任何令人满意的结果:

List1= [ "abcd", "efg", "hijk"]
List2= [ ["abcd", "hello", "world"],
         ["efg", "My name's", "Tom"], 
         ["hijk", "I", "Love you"]

dict = {}
i = 0
for element in List2:
    if element[0] == List1[i]:
        zip_iterator = zip(List1[i], element[1:])
        dict.update(zip_iterator)
           
    else:
        print("error")
        print(element[0], List1[i])
    i += 1
print(dict)

它没有给出 Traceback,而是一个奇怪的输出。请问你能帮帮我吗?

标签: python

解决方案


好像你根本不需要List1;只需从以下内容进行字典理解List2

>>> List2= [["abcd","hello", "world"], ["efg", "My name's", "Tom"], ["hijk", "I","Love you"]]
>>> {k: v for k, *v in List2}
{'abcd': ['hello', 'world'], 'efg': ["My name's", 'Tom'], 'hijk': ['I', 'Love you']}

这里,for k, *v in ...是可迭代解包的高级形式,将每个子列表的第一个元素存储在 中k,其余元素存储在v.

如果不是那么简单,并且 from 的键List1可能出现在的相应元素的任何位置,请尝试这个嵌套的字典和列表理解(注意:我打乱了 的子列表以使其更有趣):List2List2

>>> List1= ["abcd", "efg", "hijk"]
>>> List2= [["abcd","hello", "world"], ["My name's", "efg", "Tom"], ["I","Love you", "hijk"]]
>>> {k: [x for x in v if x != k] for k, v in zip(List1, List2)}
{'abcd': ['hello', 'world'], 'efg': ["My name's", 'Tom'], 'hijk': ['I', 'Love you']}

推荐阅读