Py学习  »  Python

Python:将列表中的两个项添加为key:pair to dictionary

Josh Quinn • 5 年前 • 1791 次点击  

尝试将项列表转换为键:值对:

def make_dict(a_list, category_name):

    a_dict = {}


    for i in range(0, len(a_list), 2):
        a_dict[a_list[i]] = a_list[i+1]
    return a_dict

获取此错误:

a_dict[a_list[i]] = a_list[i+1]
IndexError: list index out of range

我知道为什么,但我不知道怎么解决。有什么解决办法吗?

此外,它还在超出范围之前收集key:value对。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/51452
 
1791 次点击  
文章 [ 2 ]  |  最新文章 5 年前
NerdyGinger
Reply   •   1 楼
NerdyGinger    6 年前

您的循环当前在列表的长度处结束( len(a_list) ),但在该长度值处调用索引将使其中断。把你的循环修好,早点停止一个:

    for i in range(0, len(a_list)-1, 2): #subtract 1 from length!
        a_dict[a_list[i]] = a_list[i+1]
heemayl
Reply   •   2 楼
heemayl    6 年前

您应该为列表中的偶数个元素编写代码,但是当您有奇数个元素时,索引处的元素 i+1 不存在,因此错误。

你也可以 zip 在同一个迭代器上以成对方式使用连续值,并理解dict:

In [239]: lst = [1, 2, 3, 4, 5, 6]                                                                                                                                                                          

In [240]: {k: v for k, v in zip(*[iter(l)] * 2)}                                                                                                                                                            
Out[240]: {1: 2, 3: 4, 5: 6}

对于奇数个元素,可以使用 itertools.zip_longest 用一个 fillvalue 要填写缺少的最后一个值:

In [241]: lst = [1, 2, 3, 4, 5, 6, 7]                                                                                                                                                                       

In [242]: {k: v for k, v in itertools.zip_longest(*[iter(l)] * 2, fillvalue=None)}                                                                                                                          
Out[242]: {1: 2, 3: 4, 5: 6, 7: None}