Python - 按元组值排序元组键控字典

时间:2017-03-28 13:26:27

标签: python dictionary key tuples

我有一个由元组键和整数计数组成的字典,我希望按元组的第三个值(键[2])对其进行排序

data = {(a, b, c, d): 1, (b, c, b, a): 4, (a, f, l, s): 3, (c, d, j, a): 7}
print sorted(data.iteritems(), key = lambda x: data.keys()[2])

具有此期望的输出

>>> {(b, c, b, a): 4, (a, b, c, d): 1, (c, d, j, a): 7, (a, f, l, s): 3}

但我目前的代码似乎什么也没做。该怎么做?

修改:相应的代码

sorted(data.iteritems(), key = lambda x: x[0][2])

但在上下文中

from collections import Ordered Dict 
data = {('a', 'b', 'c', 'd'): 1, ('b', 'c', 'b', 'a'): 4, ('a', 'f', 'l', 's'): 3, ('c', 'd', 'j', 'a'): 7}
xxx = []
yyy = []
zzz = OrderedDict()
for key, value in sorted(data.iteritems(), key = lambda x: x[0][2]):
    x = key[2]
    y = key[3]
    xxx.append(x)
    yyy.append(y)
    zzz[x + y] = 1
print xxx
print yyy
print zzz

zzz是无序的。我知道这是因为词典默认是无序的,我需要使用OrderedDict对它进行排序,但我不知道在哪里使用它。如果我使用它作为检查答案表明我得到了超出范围的'元组索引'错误。

解决方案:

from collections import OrderedDict 
data = {('a', 'b', 'c', 'd'): 1, ('b', 'c', 'b', 'a'): 4, ('a', 'f', 'l', 's'): 3, ('c', 'd', 'j', 'a'): 7}
xxx = []
yyy = []
zzz = OrderedDict()
for key, value in sorted(data.iteritems(), key = lambda x: x[0][2]):
    x = key[2]
    y = key[3]
    xxx.append(x)
    yyy.append(y)
    zzz[x + y] = 1
print xxx
print yyy
print zzz

2 个答案:

答案 0 :(得分:3)

字典在Python中是无序的。但是,您可以使用OrderedDict

然后您需要排序:

from collections import OrderedDict

result = OrderedDict(sorted(data.iteritems(),key=lambda x:x[0][2]))

您需要使用key=lambda x:x[0][2],因为元素是元组(key,val),因此要获得key,您需要使用x[0]

这给出了:

>>> data = {('a', 'b', 'c', 'd'): 1, ('b', 'c', 'b', 'a'): 4, ('a', 'f', 'l', 's'): 3, ('c', 'd', 'j', 'a'): 7}
>>> from collections import OrderedDict
>>> result = OrderedDict(sorted(data.iteritems(),key=lambda x:x[0][2]))
>>> result
OrderedDict([(('b', 'c', 'b', 'a'), 4), (('a', 'b', 'c', 'd'), 1), (('c', 'd', 'j', 'a'), 7), (('a', 'f', 'l', 's'), 3)])

修改

为了同时订购zzz,您可以将代码更新为:

data = {('a', 'b', 'c', 'd'): 1, ('b', 'c', 'b', 'a'): 4, ('a', 'f', 'l', 's'): 3, ('c', 'd', 'j', 'a'): 7}
xxx = []
yyy = []
zzz = OrderedDict()
for key, value in sorted(data.iteritems(), key = lambda x: x[0][2]):
    x = key[2]
    y = key[3]
    xxx.append(x)
    yyy.append(y)
    zzz[x + y] = 1
print xxx
print yyy
print zzz

答案 1 :(得分:3)

您的关键功能完全被破坏了。它将当前值传递为x,但您忽略它,而是始终从键列表中获取第二项。

改为使用key=lambda x: x[0][2]