0

我有一些我覺得笨拙的代碼。使用python中的整數值對字符串排序

考慮:

sample_lists = [(u'1', u'penguin'), (u'2', u'kelp'), (u'5', u'egg')], 
       [(u'3', u'otter'), (u'4', u'clam')] 

我想要的結果:['penguin', 'kelp', 'otter', 'clam', 'egg'](按號排序)。你可以假設列表總是包含'1',並且每個子列表按升序排列,並且sample_lists中的所有數字都是連續的整數,如果有幫助的話。

目前,最Python的/簡潔的方式我能想到這樣做的是:

sample_list = sample_lists[0]+sample_lists[1] 
for i in xrange(len(sample_list)): 
    sample_list[0] = i+1 
return zip(*sorted(sample_list, key=operator.itemgetter(0)))[1] 

有沒有更好的辦法?我覺得這很笨拙。這裏的問題是用字符串排序,我需要將它們逐個轉換爲整數。預感會是一些lambda函數,但我對這種語法並不十分精通。如果這是最好的方法,我仍然很好奇如何使用lambda函數來做到這一點,如果可能的話。

注意,直接字符串比較一行代碼:

print zip(*sorted(sample_lists[0]+sample_lists[1], key=operator.itemgetter(0)))[1] 

不行的,因爲它不能當sample_lists含有「11」或「20」。

python 3答案沒問題,但是Python 2.7是首選。

回答

3

itemgetter很酷,但不讓你轉換爲int。在這種情況下lambda函數是更好,因爲它可以讓你做的itemgetting和Int轉換一起

>>> from itertools import chain 
>>> [x[1] for x in sorted(chain.from_iterable(sample_lists), key=lambda x:int(x[0]))] 
[u'penguin', u'kelp', u'otter', u'clam', u'egg'] 
+0

什麼是使用chain.from_iterable而不是sample_lists的優勢[0] + sample_lists [1]? – JDong

+1

@JDong,如果sample_lists有兩個以上的元素呢? –

1

Nice answer,gnibbler!我認爲是唯一缺少的是從sample_lists您sample_list轉換,它可以像這樣做:

sample_list = [item for lst in sample_lists for item in lst]

+1

是的,我錯過了。你也可以使用'chain.from_iterable'並在'sort'裏面執行' –

+0

@gnibbler:是的,這可能會更有效率,但我對'chain'還不太熟悉;-) – FriendFX

相關問題