如何保留列表列表中元素的顺序

时间:2012-07-31 22:43:51

标签: python

假设我有一个列表

lst1 = [[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2)]]

和另一个清单

lst2 = [['a', (1, 1)], ['a', (1, 2)], ['a', (1, 3)], ['b', (2, 1)], ['b', (2, 2)]]

现在我怎样才能确保在lst1中每个序列都应该是原样,这意味着在(2,2)之前没有(1,2)或之前(2,3)

如何确保在lst2中保留此顺序,这意味着['a',(1,2)]不应该出现在['a',(1,1)]或['b'之前,( 2,2)]不应该在['b',(2,1)]

之前出现

2 个答案:

答案 0 :(得分:1)

lst1[0].sort(key=lambda tpl: tpl[0]*10 + tpl[1])应该做到这一点。

您可以为lst2熟练掌握此内容:lst2.sort(key=lambda lst: lst[1][0]*10 + lst[1][1])

修改

您想要达到的顺序显然是自然顺序。因此,lst1[0].sort()lst2.sort()会按照您的问题中的说明对列表进行排序。

答案 1 :(得分:0)

您可以实现自己的“compare”功能并使用它。

例如,使用lst2

lst2 = [['a', (1, 1)], ['a', (1, 2)], ['a', (1, 3)], ['b', (2, 1)], ['b', (2, 2)]]

def compareLst2(item1, item2):
    retval = 0
    retval = ord(item1[0])  - ord(item2[0]) 
    if retval == 0:
        for i in range(2):
            retval=item1[1][i] - item2[1][i]
            if retval != 0:
                return retval
    return retval

print sorted(lst2 , cmp=compareLst2)

将角色的ascii代码放在第一个位置。 ('a' < 'b')。如果它们相等,则检查元组中的第一个数字(第二个位置),如果它们相等,则检查元组中的第二个数字......('元组'是{{ 1}})

这有点......嗯...愚蠢的方法,因为你不需要让itemWhatever[1]对字符进行排序,但是你明白了,对吗?