创建新字典以首先对Key进行排序,然后对值进行排序

时间:2020-05-09 16:56:52

标签: python dictionary

我了解惯性排序。我正在尝试制作一个新的字典,该字典按字母顺序在“键”上排序,然后在元组的最后一个元素上排序值。

当前词典:

D1 = {'Lakers': [('James','PG',23,2), ('Davis', 'PF', 3, 3), ('Johnson', 'PG', 33, 
1)], 'Pistons': [('Billips', 'PG', 1, 1 ), ('Wallace', 'C', 3, 3)], 'Hawks': 
[('Young', 'PG', 11, 1), ('Collins', 'PF', 3, 2)] }

我要的字典:

New_D1 = { 'Hawks':[('Collins', 'PF', 3, 2),('Young', 'PG', 11, 1)], 'Lakers': [('Davis', 'PF', 3, 3),('James','PG',23,2), ('Johnson', 'PG', 33, 1)], 'Pistons': [('Wallace', 'C', 3, 3),('Billips', 'PG', 1, 1 ) ] }

我当前要排序的代码是:

New_D1  = dict(sorted(D1.items()))

这将创建一个新词典(New_D1),并且仅对键进行排序。现在,我需要对元组列表的最后一个元素中的值进行排序。

5 个答案:

答案 0 :(得分:2)

您可以在已经做过的事情之外做这件事:

>>> {k: sorted(v, key=lambda t: -t[-1]) for k, v in sorted(D1.items())}
{'Hawks': [('Collins', 'PF', 3, 2), ('Young', 'PG', 11, 1)], 'Lakers': [('Davis', 'PF', 3, 3), ('James', 'PG', 23, 2), ('Johnson', 'PG', 33, 1)], 'Pistons': [('Wallace', 'C', 3, 3), ('Billips', 'PG', 1, 1)]}

答案 1 :(得分:1)

您需要构建一个新的字典,并通过对键进行排序来插入,并添加经过排序的值

    file = open("phone.txt")
    phonebook = readFile("phone.txt")
    while True:
        try:
            delete = input("Which entry would you like to delete?(enter name)")
            print()
        except ValueError:
            print("Sorry, that didn't make sense. Try again.")
            print()
            continue
        else:
            break
            print()
    with open("phone.txt", "r") as f:
        lines = f.readlines()
    with open("phone.txt", "w") as f:
        for line in lines:
            if delete not in line.strip("\n"):
                f.write(line)

您可以通过dict-comprehension内联修改,而不使用tierce dict

result ={}
for key, val in sorted(D1.items()):
    result[key] = sorted(val, key=lambda x: x[-1], reverse=True)

答案 2 :(得分:1)

您可以使用itemgetter

>>> from operator import itemgetter
>>> {k:sorted(v, key=itemgetter(3)) for k,v in New_D1.items()}

{'Hawks': [('Young', 'PG', 11, 1), ('Collins', 'PF', 3, 2)], 
'Lakers': [('Johnson', 'PG', 33, 1), ('James', 'PG', 23, 2), ('Davis', 'PF', 3, 3)], 
'Pistons': [('Billips', 'PG', 1, 1), ('Wallace', 'C', 3, 3)]}

答案 3 :(得分:0)

{k: sorted(v, key=lambda x: x[:-1]) for k,v in sorted(D1.items(), key=lambda x: x[0])}

答案 4 :(得分:0)

这真的很简单,您甚至不需要上面建议的lambda函数:

{k: sorted(v) for k,v in D1.items()}

这会产生您想要的结果:

{'Lakers': [('Davis', 'PF', 3, 3),
  ('James', 'PG', 23, 2),
  ('Johnson', 'PG', 33, 1)],
 'Pistons': [('Billips', 'PG', 1, 1), ('Wallace', 'C', 3, 3)],
 'Hawks': [('Collins', 'PF', 3, 2), ('Young', 'PG', 11, 1)]}