2017-02-21 52 views
0

我使用2个标准排序列表的Python列表:排序使用两个标准

index_sort = {'r1':1, 'r2':2, 'T1':3, 'r3':4, 'T2':5, 'T3':6} 

Eall_pairsorted = sorted(Eall_pairsorted, key = lambda e: (index_sort[e[0]], index_sort2[e[1]] )) 

的问题是,我得到:

['r1', 'r2', '++', '0.01 0.01', -56.19568267] 
['r1', 'T1', '++', '0.01 0.017453292519943295', -56.19567285] 
['r1', 'r3', '++', '0.01 0.01', -56.19568267] 
['r1', 'T2', '++', '0.01 0.017453292519943295', -56.19567285] 
['r1', 'T3', '++', '0.01 0.017453292519943295', -56.19568714] 
['r2', 'T1', '++', '0.01 0.017453292519943295', -56.19567439] 
['r2', 'r3', '++', '0.01 0.01', -56.19568267] 
['r2', 'T2', '++', '0.01 0.017453292519943295', -56.1956784] 
['r2', 'T3', '++', '0.01 0.017453292519943295', -56.19568357] 
['T1', 'T2', '++', '0.017453292519943295 0.017453292519943295', -56.19566509] 
['T1', 'T3', '++', '0.017453292519943295 0.017453292519943295', -56.19570279] 
['r3', 'T1', '++', '0.01 0.017453292519943295', -56.1956784] 
['r3', 'T2', '+-', '0.01 0.017453292519943295', -56.19567944] 
['r3', 'T3', '++', '0.01 0.017453292519943295', -56.19568357] 
['r3', 'T3', '--', '0.01 0.017453292519943295', -56.19568081] 
['r3', 'T3', '+-', '0.01 0.017453292519943295', -56.19569063] 
['r3', 'T3', '-+', '0.01 0.017453292519943295', -56.1956905] 
['T2', 'T3', '++', '0.017453292519943295 0.017453292519943295', -56.19570279] 
['T2', 'T3', '--', '0.017453292519943295 0.017453292519943295', -56.19570039] 
['T2', 'T3', '+-', '0.017453292519943295 0.017453292519943295', -56.195661] 
['T2', 'T3', '-+', '0.017453292519943295 0.017453292519943295', -56.19566132] 

,我想已经切换R3和T1在一条线上:

['r3', 'T1', '++', '0.01 0.017453292519943295', -56.1956784] 

得到以下顺序:

['T1', 'r3', '++', '0.01 0.017453292519943295', -56.1956784] 

我只想交换'T1'和'r3',而不是整列。

任何提示如何做到这一点?

+0

能否请你澄清你的问题?即删除不必要的数据,使用更易读的变量名称等。 – tcurvelo

+0

所以基本上你只想交换每个列表中的第一个和第二个元素?这与排序有什么关系?如果您希望将排序应用于翻转位置的变量,则可以在排序之前将它们翻转,或者在“键”lambda函数中更改索引的顺序。即'lambda e:(index_sort [e [1]],index_sort2 [e [0]])' –

+0

您是否想仅交换具有'r3'和'T1'或整列的条目? –

回答

0

你不能在同一时间排序做到这一点,但你可以做这样的事情算账:

Eall_pairsorted = sorted(Eall_pairsorted, key = lambda e: (e[0], e[1])) 
Eall_pairsorted = [[e[1], e[0]] + e[2:] for e in Eall_pairsorted] 

测试:

>>> Eall_pairsorted = [ 
...  ['r1', 'r2', '++', '0.01 0.01', -56.19568267], 
...  ['r1', 'T1', '++', '0.01 0.017453292519943295', -56.19567285], 
...  ['r1', 'r3', '++', '0.01 0.01', -56.19568267] 
... ] 
>>> Eall_pairsorted = [[e[1], e[0]] + e[2:] for e in Eall_pairsorted] 
>>> Eall_pairsorted 
[ 
    ['r2', 'r1', '++', '0.01 0.01', -56.19568267], 
    ['T1', 'r1', '++', '0.01 0.017453292519943295', -56.19567285], 
    ['r3', 'r1', '++', '0.01 0.01', -56.19568267] 
] 
+0

这是不对的。它弄糟了第一个元素,因为我得到的回报:'r2','r1','T1','r1','r3','r1'等等 – Monica

+1

我可能误解了你的问题。请检查测试示例,是您想要的吗? – Marat

+0

好的,我明白了。排序键是错误的 – Marat

0

你只需要重新排列第一在这个特定情况下列表中的两个元素?或者你想在这里应用哪一个通用规则?我想你应该真的澄清你的问题。如果只有一个特定的案例困扰着你,下面的工作将会起作用。

随着列表理解:

lst = [ 
    ['r1', 'r2', '++', '0.01 0.01', -56.19568267], 
    ['r3', 'T1', '++', '0.01 0.017453292519943295', -56.19567285], 
    ['r1', 'r3', '++', '0.01 0.01', -56.19568267]] 

lst = [['T1', 'r3'] + x[2:] if x[0:2] == ['r3', 'T1'] else x for x in lst] 

没有列表理解:

Eall_pairsorted = [ 
    ['r1', 'r2', '++', '0.01 0.01', -56.19568267], 
    ['r3', 'T1', '++', '0.01 0.017453292519943295', -56.19567285], 
    ['r1', 'r3', '++', '0.01 0.01', -56.19568267]] 

for index, item in enumerate(Eall_pairsorted): 
    if item[0:2] == ['r3', 'T1']: 
     Eall_pairsorted[index][0:2] = ['T1', 'r3']