对字典的相互依赖元素进行排序

时间:2015-11-02 20:23:38

标签: python python-2.7

我有这样的字典

dict = {'name':''xyz','c1':['a','b','r','d','c'],'c2':['21','232','11','212','34']}

这里dict.c1值和dict.c2值是相​​互依赖的。也就是说,'a'与'21'相关,'d'与'212'相关,'b'与'232'相关...... 我必须排序c1和c2应该得到相应的反映。最终输出应为

dict = {'name':''xyz','c1':['a','b','c','d','r'],'c2':['21','232','34','212','11']}

最有效的方法是什么?

4 个答案:

答案 0 :(得分:2)

这有效:

d = {'name': 'xyz','c1':['a','b','r','d','c'],'c2':['21','232','11','212','34']}
s = sorted(list(zip(d['c1'], d['c2'])))
d['c1'] = [x[0] for x in s]
d['c2'] = [x[1] for x in s]

结果:

{'c1': ['a', 'b', 'c', 'd', 'r'],
 'c2': ['21', '232', '34', '212', '11'],
 'name': 'xyz'}

<强>更新

不需要调用list。感谢tzaman提示。这是将各个步骤的解决方案整合在一起的遗留问题。

d = {'name': 'xyz','c1':['a','b','r','d','c'],'c2':['21','232','11','212','34']}
s = sorted(zip(d['c1'], d['c2']))
d['c1'] = [x[0] for x in s]
d['c2'] = [x[1] for x in s]

答案 1 :(得分:1)

您的数据结构不反映其元素之间的真实关系。我首先将c1和c2合并到OrderedDict中。它将关注元素的关系和顺序。像这样:

dict = dict(
    name='xyz', 
    c = OrderedDict(sorted(
        zip(
            ['a','b','r','d','c'],
            ['21','232','11','212','34']
        )
    ))
)

答案 2 :(得分:1)

坦率地说,最有效的方法是以与其使用兼容的形式存储数据。在这种情况下,您将使用表格(例如PANDAS数据框)或仅使用列表:

xyz_table = [('a', '21'), ('b'. 232'), ...]

然后,您只需在每个元组的第一个元素上对列表进行排序:

xyz_table = [('a', '21'), ('b', '232'), ('c', '34'), ('d', '212'), ('r', '11')]
xyz_sort = sorted(xyz_table, key = lambda row: row[0])

print xyz_sort

您还可以查找Python排序的入门知识,例如this

答案 3 :(得分:0)

这是你可以做到的一种方式,使用zip连接和取消连接。当您将它们放回字典中时,可以将它们重新强制转换为列表而不是元组。

a = ['a','b','r','d','c']
b = ['21','232','11','212','34']
mix = list(zip(a, b))
mix.sort()
a_new, b_new = zip(*mix)
>>> a_new
('a', 'b', 'c', 'd', 'r')
>>> b_new
('21', '232', '34', '212', '11')