打印具有多个值的元组键字典

时间:2014-05-05 03:07:34

标签: python dictionary

我有一本字典,其中作者的姓氏和名字是关键,书籍,数量和价格是价值。我想打印出来,按作者姓名按字母顺序排序,然后按书名排序。

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']]})

2 个答案:

答案 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")

这是你的想法吗?你当然可以将它放在一个函数中,以便更容易调用它。