2016-09-23 48 views
-1

我有一個整數列表(這些列表不是真正的整數,這只是爲了簡單的問題),我想過濾正數和負數那些(兩份名單引起我的興趣)在給出條件的兩個列表中分開一個列表

我的解決方案:

main_list = [50,-354,10,34,-56,10] 

negatives = list(filter(lambda x : x < 0,main_list)) 
positives = list(filter(lambda x : x >= 0,main_list)) 

的作品,但執行2個filter操作

for i in main_list: 
    if i < 0: 
     negatives.append(i) 
    else: 
     positives.append(i) 

作品,但不是很Python的。

創建集合並從主列表中減去正項不是一個選項,因爲它使用不必要的散列。

那麼有沒有更好的方法來做到這一點? (單行大加讚賞)

編輯:我發現onelining它沒有太多的測試

for i in main_list: (negatives if i < 0 else positives).append(i) 
+0

如何名單的大是它充分利用?你能分類嗎?總結一下? – MooingRawr

+2

爲什麼你認爲第二個例子確切地不是Pythonic? –

+0

@JonClements我個人認爲它看起來非常像任何其他語言。但它確實具有可迭代性,不過我曾經討論過的最常見的人也認爲Python主要是Magic One Liners。 – MooingRawr

回答

2

取決於你原來的沒有那麼糟糕(從原來的問題的答案不同)的方式標準是,你可以使用itertools.groupby

>>> from itertools import groupby 
>>> {str(k):list(g) for k, g in groupby(sorted(main_list), key=lambda x: x < 0)} 
{'False': [10, 10, 34, 50], 'True': [-354, -56]} 

但一個不能告訴,如果這是更有效的超過兩個列表推導或循環(這看起來不錯),除非你的時間兩者的性能方法。

+0

這需要一個'O(n log n)'排序和一個lambda,所以我會驚訝它比線性解決方案更快。 –

0

如何將原始副本作爲positives開始,然後通過一次性從positives中刪除的項目填充negatives

pop的迴歸

main_list = [50, -354, 10, 34, -56, 10] 

positives = main_list[:] 
negatives = [positives.pop(positives.index(x)) for x in main_list if x < 0] 
print(positives) # -> [50, 10, 34, 10] 
print(negatives) # -> [-354, -56] 
相關問題