我有这样的字典
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']}
最有效的方法是什么?
答案 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')