【问题标题】:Python: adding two items from a list as key:pair to dictionaryPython:将列表中的两项作为键添加:对字典
【发布时间】:2019-11-21 10:12:05
【问题描述】:

尝试将项目列表作为键:值对转换为字典:

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

我明白为什么,但我不知道如何解决它。有什么解决办法吗?

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

【问题讨论】:

  • 您能否添加示例输入和预期输出?
  • 您的代码应该可以工作,但前提是a_list 中有偶数个项目。请确保是这种情况。
  • 你也可以dict(zip(a_list[::2], a_list[1::2])).
  • @jdehesa 非常简单的解决方案,只是想知道你能解释一下分号(a_list[::2], a_list[1::2]),这样我就可以做自己的进一步研究以充分了解那里发生了什么?干杯。
  • @JoshQuinn 是的,列表切片语法为my_list[first:last:step]first 默认为列表开头,last 为结尾,step 为 1。 firstlast(不包括在内)在 step 项目中取 1 个。还有更多技巧(您可以让 step first 和 last 默认值是相反的,或者使用索引 my_list[-2:] 采用最后两项)。我拿偶数和奇数和zip 来制作dict

标签: python list dictionary append


【解决方案1】:

您的代码应该适用于列表中的偶数个元素,但是当您有奇数个元素时,索引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_longestfillvalue 来填充缺失的最后一个值:

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}

【讨论】:

    【解决方案2】:

    您的循环当前以列表的长度 (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]
    

    【讨论】:

      猜你喜欢
      • 2016-05-28
      • 2018-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多