如何按键对字典中的字典进行排序

时间:2017-06-01 19:08:34

标签: python sorting dictionary

你可以帮助我一点点我的python代码中的某个地方。 如果我的英语不好,我很抱歉,但我会尽我所能。

dict = {2: {20.934144973754883: 'red'},
      8: {36.431842803955078: 'blue'},
      9: {27.323692321777344: 'blue'},
     15: {37.194934844970703: 'blue'},
     18: {19.550689697265625: 'red'}}
y = []
x = []

for key,value in dict.items():
    y.append(key)

    for val,color in value.items():
        x.append(val)
        c.append(color)

plt.scatter(sorted(x),sorted(y),color = c)

为了对数据进行排序,我对x和y进行了排序。但是当我分散我的情节时,颜色哪里错了。我知道这是因为我没有对颜色进行分类。但如果我尝试对它们进行排序,我就会失败。由于变量值:

value = {20.934144973754883: 'red'}
        {36.431842803955078: 'blue'}
        {27.323692321777344: 'blue'}
        {37.194934844970703: 'blue'}
        {19.550689697265625: 'red'}

你无法对此进行排序。 请帮助我,我不知道该怎么做

2 个答案:

答案 0 :(得分:1)

实施quantik's suggestion以使用collections.OrderedDict可以对密钥进行排序,并可能产生所需的结果:

import collections

d = collections.OrderedDict()

d[2]  = {20.934144973754883: 'red'}
d[8]  =  {36.431842803955078: 'blue'}
d[9]  = {27.323692321777344: 'blue'}
d[15] = {37.194934844970703: 'blue'}
d[18] = {19.550689697265625: 'red'}

y = []
x = []

for key,value in d.items():
    y.append(key)

    for val,color in value.items():
        x.append(val)
        c.append(color)

plt.scatter(sorted(x),sorted(y),color = c)

生成此输出:

colors scatter plot

答案 1 :(得分:0)

  

为了对数据进行排序,我对x和y进行了排序。但是当我分散我的情节时,颜色就错了。

您的预期结果不明确,但我觉得您有兴趣直接绘制数据。

  

我知道,因为我没有对颜色进行分类。

如果您只对字典中的数据进行绘图感兴趣,则无需进行排序,因为我们可以并行解包字典。

  

但如果我尝试对它们进行排序我就会失败。

目前,您正在单独拆开部分数据,这会导致错位。您可能会错误地对数据进行排序以纠正此错位。

相反,尝试使用for循环解压缩或列表理解(使用注释d代替内置dict变量):

import matplotlib.pyplot as plt

#%matplotlib inline

d = { 2: {20.934144973754883: 'red'},
      8: {36.431842803955078: 'blue'},
      9: {27.323692321777344: 'blue'},
     15: {37.194934844970703: 'blue'},
     18: {19.550689697265625: 'red'}}

data = [(x, y, c) for y, v in d.items() for x, c in v.items()]

for x, y, c in data:
    plt.scatter(x, y, color=c)

enter image description here

或者,您可以使用以下内容替换最后两行,使用zip并行解包所有x, y, c数据:

xs, ys, cs = zip(*data)
plt.scatter(xs, ys, color=cs)