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

时间:2015-10-27 00:13:12

标签: 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 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

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

2 个答案:

答案 0 :(得分:0)

您可以通过这种方式避免问题:

>>> 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)

答案 1 :(得分:-1)

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

这是你的代码:

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())))

从你的评论中,它是作业,你不能导入任何东西......然后考虑简单地循环排序的键,将键和值添加到最初的空白列表......