2015-02-10 49 views
0

說我有一個對象列表。也許它有一些整數,一些字符串和一些浮點數。我想要做的排序是列表中,這樣所有的整數移動到列表的末尾,但沒有其他類型的排序是這樣的觸摸,...按Python中的類型排序

for idx, el in enumerate(somelist): 
    if el.__class__ is int: 
     somelist.append(somelist.pop(idx)) 

我的問題是,是否有以單線形式優雅地做這件事的方法?

回答

3

isinstance(x,int)TrueFalse因此整數將無法移動到結束:

l = [1.0,"foo",2,3,"bar"] 
print(sorted(l, key=lambda x: isinstance(x,int))) 
[1.0, 'foo', 'bar', 2, 3] 
2

如果你不關心的地方做...

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)。

+0

謝謝!忘了你可以有一個以上的理解一條線haha – Raphi 2015-02-10 19:07:04

4

布爾值在Python中是可訂購的。排序穩定。

..., key=lambda x: isinstance(x, int), ... 
+0

這是一些性感的代碼先生! – Raphi 2015-02-10 19:10:21

1

也許這會以另一種方式是有用的:

>>> 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') 
>>>