1

假设我有一个清单

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 中每个序列都应该保持原样,这意味着在 (1,1) 之前没有 (1,2) 或 (2,2) 之前没有 (2,3)

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

4

2 回答 2

1

lst1[0].sort(key=lambda tpl: tpl[0]*10 + tpl[1])应该做的伎俩。

你也可以熟练地做到这一点lst2lst2.sort(key=lambda lst: lst[1][0]*10 + lst[1][1])

编辑:

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

于 2012-07-31T22:59:10.280 回答
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')。如果它们相等,则检查元组中的第一个数字(第二个位置),如果它们相等,则检查元组中的第二个数字...(“元组”是itemWhatever[1]

这有点……嗯……愚蠢的方法,因为你不需要ord对字符进行排序,但你明白了,对吧?

于 2012-07-31T23:09:17.233 回答