我一直在编写一些基本上打印字典的代码,但按字母顺序排列。所以我从任何像这样的字典开始......
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
当我用三个键启动字典时它起作用,但每次添加一个键时,最后一个键都不会显示。为什么会这样?我认为既然列表中现在还有两个对象,它应该仍然可以工作,但它没有。
答案 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())))
从你的评论中,它是作业,你不能导入任何东西......然后考虑简单地循环排序的键,将键和值添加到最初的空白列表......