安排嵌套元组

时间:2013-11-18 20:15:46

标签: list sorting python-3.x tuples

我知道这可能是一个愚蠢的问题,我为此道歉,但我对python很新,并且已经尝试解决这个问题很长一段时间没有成功。 我有一个类似于下面的元组的列表:

data = [('ralph picked', ['nose', '4', 'apple', '30', 'winner', '3']), 
('aaron popped', ['soda', '1', 'popcorn', '6', 'pill', '4', 'question', '29'])]

我想将嵌套列表排在其他地方:

data = [('ralph picked', ['apple', '30', 'nose', '4', 'winner', '3']), 
('aaron popped', ['question', '29', 'popcorn', '6', 'pill', '4', 'soda', '1'])]

我尝试使用简单的

sorted(data)

但我得到的只是元组排序的第一项。我在这里缺少什么?我非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

我们只考虑内部列表。第一个问题是,你似乎想要将单词,数字对保持在一起。我们可以使用zip来组合它们,记住seq[::2]为我们提供从第0个开始的每个第二个元素,seq[1::2]从第一个开始给我们每一秒:

>>> s = ['nose', '4', 'apple', '30', 'winner', '3']
>>> zip(s[::2], s[1::2])
<zip object at 0xb5e996ac>
>>> list(zip(s[::2], s[1::2]))
[('nose', '4'), ('apple', '30'), ('winner', '3')]

现在,正如你所发现的那样,如果你在一个序列上调用sorted,它首先按第一个元素排序,然后按第二个元素排序,打破关系等,尽可能深入。因此,如果我们就此致电sorted

>>> sorted(zip(s[::2], s[1::2]))
[('apple', '30'), ('nose', '4'), ('winner', '3')]

嗯,看起来它有效,但只有侥幸,因为apple-nose-winner按字母顺序排列。我们真的想按第二个词排序。 sorted需要key参数:

>>> sorted(zip(s[::2], s[1::2]), key=lambda x: x[1])
[('winner', '3'), ('apple', '30'), ('nose', '4')]

这也不起作用,因为它按字典顺序对数字字符串进行排序(字典式,因此'30'出现在'4'之前)。我们可以告诉它我们想要使用数值,但是:

>>> sorted(zip(s[::2], s[1::2]), key=lambda x: int(x[1]))
[('winner', '3'), ('nose', '4'), ('apple', '30')]

几乎就在那里 - 我们希望这种情况发生逆转:

>>> sorted(zip(s[::2], s[1::2]), key=lambda x: int(x[1]), reverse=True)
[('apple', '30'), ('nose', '4'), ('winner', '3')]

这几乎是正确的,但我们需要压扁它。我们可以使用嵌套列表理解:

>>> s2 = sorted(zip(s[::2], s[1::2]), key=lambda x: int(x[1]), reverse=True)
>>> [value for pair in s2 for value in pair]
['apple', '30', 'nose', '4', 'winner', '3']

或使用itertools.chain

>>> from itertools import chain
>>> list(chain.from_iterable(s2))
['apple', '30', 'nose', '4', 'winner', '3']

我认为这就是我们想去的地方。