我有一个元组列表
[((A,B),2),((C,B),3)]
我需要排序为
[((A,B),2),((B,C),3)]
我需要使用sorted()
方法按字母顺序排列所有元组。我使用过key = lambda x : x[0]
但是没有用。有什么想法吗?
答案 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]