2015-02-10 3 views
0

Скажем, у меня есть список объектов. Может быть, у него есть некоторые ints, некоторые строки и некоторые float. То, что я хотел бы сделать, это своего рода список, так что все Интс перемещаются в конец списка, но никакие другие типы не трогает, то вроде этого ...Сортировка по типу в Python

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

Мой вопрос, есть ли способ сделать это элегантно как однострочный?

ответ

3

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] 
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

4

Булевы значения можно заказать в Python. И сортировка стабильна.

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

Это какой-то сексуальный код сэр! – Raphi

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') 
>>> 
Смежные вопросы