1

不器用だと思うコードがいくつかあります。

与えられた:

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は連続した整数であると想定できます。

現在、これを行うと考えることができる最もpythonic/簡潔な方法は次のとおりです。

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]

より良い方法はありますか?これはかなりやばい気がします。ここでの問題は、文字列による並べ替えです。文字列を 1 つずつ int に変換する必要があります。予感はラムダ関数ですが、私はその構文にあまり精通していません。これが最善の方法である場合、可能であれば、ラムダ関数を使用してこれを行う方法についてまだ興味があります。

直接文字列比較のワンライナーに注意してください。

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

sample_lists に「11」または「20」が含まれていると失敗するため、機能しません。

Python 3 の回答で問題ありませんが、Python 2.7 が推奨されます。

4

2 に答える 2

3

itemgetter はクールですが、int に変換できません。この場合、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']
于 2013-07-15T04:28:19.167 に答える
1

いい答えだ、ニブラー!私が欠けていると思う唯一のことは、次のように行うことができる、sample_lists から sample_list への変換です。

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

于 2013-07-15T04:34:38.737 に答える