按字母顺序对元组的元组进行排序

时间:2016-09-27 16:10:19

标签: python python-3.x

我有一个元组列表
[((A,B),2),((C,B),3)] 我需要排序为

[((A,B),2),((B,C),3)]

我需要使用sorted()方法按字母顺序排列所有元组。我使用过key = lambda x : x[0]但是没有用。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您可以在sorted中使用list comprehension

In [3]: tups = [(('A','B'),2),(('C','B'),3)]

In [4]: [(sorted(t[0]), t[1]) for t in tups]
Out[4]: [(['A', 'B'], 2), (['B', 'C'], 3)]

答案 1 :(得分:1)

由于@AmiTarovy解决了它,但他的方法不包括对外元组的第二个元素进行排序,当有两个或多个tuple元素具有相同的第一个元素时。

所以这是另一种解决方案,也可以对外元组的第二个参数进行排序。

>>> from operator import itemgetter
>>> tups = [(('A','B'),2),(('C','B'),3), (('A','B'),1)]
>>> sorted(tups, key=itemgetter(0,1))
[(('A', 'B'), 1), (('A', 'B'), 2), (('C', 'B'), 3)]

如果您只想按第一个元组排序

>>> from operator import itemgetter
>>> tups = [(('A','B'),2),(('C','B'),3), (('A','B'),1)]
>>> sorted(tups, key=itemgetter(0))
[(('A', 'B'), 2), (('A', 'B'), 1), (('C', 'B'), 3)]

<强>更新

耗时。

是100条记录
((random.choice(string.ascii_uppercase), random.choice(string.ascii_uppercase)), random.randint(0,100))

结果

@AmiTarovy回答只用元组的第一个元素排序

python3 -m timeit -s "import random; import string; tups = [((random.choice(string.ascii_uppercase), random.choice(string.ascii_uppercase)), random.randint(0,100)) for i in range(100)]" 'from operator import itemgetter; [(sorted(t[0]), t[1]) for t in tups]'
10000 loops, best of 3: 42.7 usec per loop
10000 loops, best of 3: 43.2 usec per loop
10000 loops, best of 3: 43.9 usec per loop

我的回答是只用元组的第一个元素

排序
python3 -m timeit -s "import random; import string; tups = [((random.choice(string.ascii_uppercase), random.choice(string.ascii_uppercase)), random.randint(0,100)) for i in range(100)]" 'from operator import itemgetter; sorted(tups, key=itemgetter(0))'
10000 loops, best of 3: 36.1 usec per loop
10000 loops, best of 3: 36.6 usec per loop
10000 loops, best of 3: 37.9 usec per loop

我的答案是整个排序,但第一个元素是优先级

python3 -m timeit -s "import random; import string; tups = [((random.choice(string.ascii_uppercase), random.choice(string.ascii_uppercase)), random.randint(0,100)) for i in range(100)]" 'from operator import itemgetter; sorted(tups, key=itemgetter(0,1))'
10000 loops, best of 3: 61 usec per loop
10000 loops, best of 3: 60.2 usec per loop
10000 loops, best of 3: 60.6 usec per loop

答案 2 :(得分:0)

ActionJob

输出:

l = [(('A','B'),2),(('C','B'),3)]
f=[(tuple(sorted(x[0])),x[1]) for x in l]