2016-09-27 41 views
-2

我的元組
[((A,B),2),((C,B),3)] ,我需要整理爲排序元組的元組按字母順序

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

我需要所有的記錄是在使用sorted()方法按字母順序排列的列表。我用key = lambda x : x[0]但不起作用。有任何想法嗎?

+0

您有一個包含兩元組二元組的列表(你想排序)和一個整數。對列表進行排序不會對您有所幫助。 – jonrsharpe

回答

1

可以使用sortedlist 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

由於@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)] 

UPDATE

時間消耗排序。輸入數據是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 
0
l = [(('A','B'),2),(('C','B'),3)] 
f=[(tuple(sorted(x[0])),x[1]) for x in l] 

輸出:

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