說我有一個對象列表。也許它有一些整數,一些字符串和一些浮點數。我想要做的排序是列表中,這樣所有的整數移動到列表的末尾,但沒有其他類型的排序是這樣的觸摸,...按Python中的類型排序
for idx, el in enumerate(somelist):
if el.__class__ is int:
somelist.append(somelist.pop(idx))
我的問題是,是否有以單線形式優雅地做這件事的方法?
說我有一個對象列表。也許它有一些整數,一些字符串和一些浮點數。我想要做的排序是列表中,這樣所有的整數移動到列表的末尾,但沒有其他類型的排序是這樣的觸摸,...按Python中的類型排序
for idx, el in enumerate(somelist):
if el.__class__ is int:
somelist.append(somelist.pop(idx))
我的問題是,是否有以單線形式優雅地做這件事的方法?
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]
如果你不關心的地方做...
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), ...
這是一些性感的代碼先生! – Raphi 2015-02-10 19:10:21
也許這會以另一種方式是有用的:
>>> 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')
>>>
謝謝!忘了你可以有一個以上的理解一條線haha – Raphi 2015-02-10 19:07:04