我有一些代码让我觉得笨拙。
假设:
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
中的所有数字都是连续的整数,如果有帮助的话。
目前,我能想到的最简单/最简洁的方法是:
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。
答案 0 :(得分: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']
答案 1 :(得分:1)
Nice answer,gnibbler!我认为唯一缺少的是从sample_lists到sample_list的转换,可以这样做:
sample_list = [item for lst in sample_lists for item in lst]