按类型排序 Python
Sorted by type in Python
假设我有一个对象列表。也许它有一些整数、一些字符串和一些浮点数。我想做的是对列表进行排序,以便所有整数都移动到列表的末尾,但没有其他类型被触及,有点像这样...
for idx, el in enumerate(somelist):
if el.__class__ is int:
somelist.append(somelist.pop(idx))
我的问题是,有没有一种方法可以优雅地单行执行此操作?
如果你不在乎如何做到位...
newlist = [i for i in somelist if not isinstance(x, int)] + [i for i in somelist if isinstance(x, int)]
很方便,因为 Python 2.2,排序是 stable,所以你也可以只做...
somelist.sort(key=lambda x: isinstance(x, int))
但是请注意,这确实意味着 int
的任何 子类 也将移至列表的末尾 - 如果您不希望这样,您想把条件改成type(x) is int
).
布尔值可在 Python 中排序。而且排序稳定
..., key=lambda x: isinstance(x, int), ...
isinstance(x,int)
将是 True
或 False
因此整数将移至末尾:
l = [1.0,"foo",2,3,"bar"]
print(sorted(l, key=lambda x: isinstance(x,int)))
[1.0, 'foo', 'bar', 2, 3]
也许这在其他方面会有用:
>>> a=[4,'3','2', 6,7,4,'ssa']
>>> for i,j in groupby(sorted(a, key=lambda x: str(type(x))), type):
... tuple(j)
...
(4, 6, 7, 4)
('3', '2', 'ssa')
>>>
假设我有一个对象列表。也许它有一些整数、一些字符串和一些浮点数。我想做的是对列表进行排序,以便所有整数都移动到列表的末尾,但没有其他类型被触及,有点像这样...
for idx, el in enumerate(somelist):
if el.__class__ is int:
somelist.append(somelist.pop(idx))
我的问题是,有没有一种方法可以优雅地单行执行此操作?
如果你不在乎如何做到位...
newlist = [i for i in somelist if not isinstance(x, int)] + [i for i in somelist if isinstance(x, int)]
很方便,因为 Python 2.2,排序是 stable,所以你也可以只做...
somelist.sort(key=lambda x: isinstance(x, int))
但是请注意,这确实意味着 int
的任何 子类 也将移至列表的末尾 - 如果您不希望这样,您想把条件改成type(x) is int
).
布尔值可在 Python 中排序。而且排序稳定
..., key=lambda x: isinstance(x, int), ...
isinstance(x,int)
将是 True
或 False
因此整数将移至末尾:
l = [1.0,"foo",2,3,"bar"]
print(sorted(l, key=lambda x: isinstance(x,int)))
[1.0, 'foo', 'bar', 2, 3]
也许这在其他方面会有用:
>>> a=[4,'3','2', 6,7,4,'ssa']
>>> for i,j in groupby(sorted(a, key=lambda x: str(type(x))), type):
... tuple(j)
...
(4, 6, 7, 4)
('3', '2', 'ssa')
>>>