我有一本字典,其中作者的姓氏和名字是关键,书籍,数量和价格是价值。我想打印出来,按作者姓名按字母顺序排序,然后按书名排序。
The author is: Dickens, Charles
The title is: Hard Times
The qty is: 7
The price is: 27.00
----
The author is: Shakespeare, William
The title is: Macbeth
The qty is: 3
The price is: 7.99
----
The title is: Romeo And Juliet
The qty is: 5
The price is: 5.99
我对字典很新,并且无法理解如何对字典进行排序。到目前为止我的代码是:
def displayInventory(theInventory):
theInventory = readDatabase(theInventory)
for key in theInventory:
for num in theInventory[key]:
print("The author is", ' '.join(str(n) for n in key))
print(' '.join(str(n) for n in num), '\n')
字典在打印时,我从中读到这个字样如下:
defaultdict(<class 'list'>, {('Shakespeare', 'William'): [['Rome And Juliet', '5', '5.99'], ['Macbeth', '3', '7.99']], ('Dickens', 'Charles'): [['Hard Times', '7', '27.00']]})
答案 0 :(得分:1)
fwiw,camelCase在Python中非常罕见;几乎所有东西都是用snake_case编写的。 :)
我会这样做:
for names, books in sorted(inventory.items()):
for title, qty, price in sorted(books):
print("The author is {0}".format(", ".join(names)))
print(
"The book is {0}, and I've got {1} of them for {2} each"
.format(title, qty, price))
print()
暂时忽略not everyone has a first and last name ...
这里涉及一些小技巧。
首先,inventory.items()
生成一个key, value
元组列表。然后我可以直接对它进行排序,因为元组按元素排序 - 也就是说,(1, "z")
在(2, "a")
之前排序。所以Python会首先比较密钥,密钥本身就是元组,因此它会比较姓氏和名字。正是你想要的。
我也可以直接对books
进行排序,因为我实际上想按标题排序,标题是每个结构中的第一件事。
我可以直接.join
names
元组,因为我已经知道其中的所有内容都应该是一个字符串,如果情况不是这样,那就错了。
然后我在任何地方使用.format()
,因为str()
有点难看。
答案 1 :(得分:0)
关键是使用sorted()按键对字典进行排序,然后对字典值使用sort()。这是必要的,因为您的值实际上是列表列表,似乎您只想按每个子列表中的第一个值对它们进行排序。
theInventory = {('Shakespeare', 'William'): [['Rome And Juliet', '5', '5.99'], ['Macbeth', '3', '7.99']], ('Dickens', 'Charles'): [['Hard Times', '7', '27.00']]}
for Author in sorted(theInventory.keys()):
Author_Last_First = Author[0]+", "+Author[1]
Titles = theInventory[Author]
Titles.sort(key=lambda x: x[0])
for Title in Titles:
print("Author: "+str(Author_Last_First))
print("Title: "+str(Title[0]))
print("Qty: "+str(Title[1]))
print("Price: "+str(Title[2]))
print("\n")
这是你的想法吗?你当然可以将它放在一个函数中,以便更容易调用它。