Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
打印列表时列表索引超出范围(Python)_Python_List_Dictionary - Fatal编程技术网

打印列表时列表索引超出范围(Python)

打印列表时列表索引超出范围(Python),python,list,dictionary,Python,List,Dictionary,我一直在写一些基本上可以打印字典的代码,但是这些代码的键是按字母顺序排列的。所以我从这本字典开始 d = {'a' : 52, 'b' : 30, 'c' : 36} 所以我做了这个函数来转换和显示它们 def alph_order(d): l = sorted(d.keys()) for i in range(0, len(l), 2): l.insert(i+1, d[l[i]]) l.append(d[l[-1]]) for i in ra

我一直在写一些基本上可以打印字典的代码,但是这些代码的键是按字母顺序排列的。所以我从这本字典开始

d = {'a' : 52, 'b' : 30, 'c' : 36}
所以我做了这个函数来转换和显示它们

def alph_order(d):
    l = sorted(d.keys())
    for i in range(0, len(l), 2):
        l.insert(i+1, d[l[i]])
    l.append(d[l[-1]])
    for i in range(0, len(l), 2):
        print(l[i], '     :', l[i+1])
所以它打印出来

a     : 52
b     : 30
c     : 36
但当我向字典中添加另一个键和值并再次调用该函数时,它会按字母顺序打印出前三个,然后说

    print(l[i], '     :', l[i+1])
IndexError: list index out of range

当我用三个键启动字典时,它会工作,但每次添加一个键时,最后一个键都不会显示。为什么会这样?我认为,由于列表中现在有两个以上的对象,它应该仍然可以工作,但它不能工作。

您当前必须在用于将词典转换为所需列表格式的代码中出错

这是您的代码:

l = sorted(d.keys())
for i in range(0, len(l), 2): 
    l.insert(i+1, d[l[i]]) 

l.append(d[l[-1]])
不会将字典中的所有值插入列表中。如果您的字典中有
m
项,则循环只会将字典中的
m//2
值插入列表。(然后您还添加了最后一个项目,但如果
m>3
,您仍然会缺少项目)

要正确地将字典转换为所需格式的列表(先输入键,然后输入值,按排序顺序),可以按如下操作:

import itertools

# d is a dictionary
my_list = list(itertools.chain.from_iterable(sorted(my_dict.items())))
说明

my_list = list(
    # glue all of the sorted (key, value) pairs together
    itertools.chain.from_iterable(
        # sort the (key, value) pairs, giving a list [(k, v), ...]
        sorted(
            # get all of the (key, value) pairs in the dict
            my_dict.items())))

从你的评论来看,这是家庭作业,你不能导入任何东西。。。然后考虑简单地在排序键上循环,将密钥和值添加到初始空白列表…

,可以避免这样的问题:

>>> for k, v in zip(l[::2], l[1::2]):
...     print(k, '     :', v)
... 
('a', '     :', 52)
('b', '     :', 30)
('c', '     :', 36)
无论如何,这里有一种更优雅、更恰当的方式来满足您的需求:

>>> d = {'a': 52, 'b': 30, 'c': 36}
>>> for item in sorted(d.items(), key=lambda x: x[0]):
...    print(item)
... 
('a', 52)
('b', 30)
('c', 36)

您的新列表是什么样子的?鉴于循环的外观,只有当列表长度为奇数(而非偶数)时,才会发生此错误。因此,您不能添加两个新成员,而只能添加一个。可能是您将
dict
转换为
list
l=sorted(d.keys())用于范围(0,len(l),2)中的i:l.insert(i+1,d[l[i]])l.append(d[l[-1]]
您能在原始帖子中发布代码以使其格式正确吗?OP中没有足够的信息来给出实际答案。他们收到的错误表明列表的长度为奇数,这肯定足以表明他们无法将字典转换为预期的列表格式。因此,这可能是真正的问题,这是一个解决方案。这是一个家庭作业,我们的教授说,我们不能导入任何东西来帮助我们