2015-09-22 25 views
2

我想根據一些表達式將列表拆分爲多個列表。什麼是有效的方式來分割一個列表到Python中的幾個列表

例如:

for elem in elemList: 
    if elem>0 and elem<=3 add element to Partition1 
    if elem>3 and elem<=6 add element to Partition2 
    else     add element to Partition3 

如何有效地做到這一點? 在複雜度爲O(1)的C++列表中是否存在類似erase和push_back的東西?

還有其他一些可以做到的集合嗎?

+1

分區1 = [ELEM用於elemList ELEM如果ELEM> 0和元素<= 3] 列表理解是比在效率,但它只能包含一個if語句以下一個for語句 –

+0

最絕**不是**這個問題的重複。這隻與groupby的正確用例有一點相似之處;這些組不是連續的,並且分組條件可以更好地表達爲謂詞序列而不是分組鍵。 – user2357112

+0

@PunyTitan所有elemsn限制在0和9之間?或者可以有其他元素? –

回答

1

首先,here是Python中各種操作的時間複雜性的好備忘單。

鑑於您對我的聲明的最後一次回覆,我假設您想要使用並將給定列表拆分爲三個單獨的列表,而不通過理解創建任何中間列表。完成此操作的一種方法是將數據結構更改爲collections.deque,因爲list.remove()需要O(n)(因爲它需要移位元素)deque.popleft()需要O(1)

>>> def partition(queue): 
...  partition1, partition2, partition3 = [], [], [] 
...  while queue: 
...   ele = queue.popleft() 
...   if 0 < ele <= 3: 
...    partition1.append(ele) 
...   elif 3 < ele <= 6: 
...    partition2.append(ele) 
...   else: 
...    partition3.append(ele) 
...  return partition1, partition2, partition3 

>>> import collections 
>>> p1, p2, p3 = partition(collections.deque(range(10))) 

>>> print p1 
[1, 2, 3] 

>>> print p2 
[4, 5, 6] 

>>> print p3 
[0, 7, 8, 9] 
2

如果我理解正確的問題,你可以使用list comprehensions

Partition1 = [elem for elem in elemList if elem <= 3] 
Partition2 = [elem for elem in elemList if elem > 3 and elem <= 6] 
Partition3 = [elem for elem in elemList if elem > 6] 

這是做(對分區1)的Python的方式:

Partition1 = [] # creates an empty list 
for elem in elemList: # for each element in list 
    if elem > 0 and elem <= 3: # if they satisfy the condition 
     Partition1.append(elem) # append them to the list 

編輯:我假設上面所有元素都大於零...如果其中一些元素不是,則Partition1和Partition3的列表解析必須是:

Partition1 = [elem for elem in elemList if elem > 0 and elem <= 3] 
Partition3 = [elem for elem in elemList if elem > 6 or elem <= 0] 
+0

@JoseRicardoBustosM。 「更好」在哪個意義上? – alfasin

+0

@JoseRicardoBustosM .:地獄沒有。 groupby完全不適合該任務,主要原因是這些組不需要連續。 – user2357112

+0

@JoseRicardoBustosM:這只是三次傳球,並且爲了讓groupby變得更好,你需要制定分組密碼,這樣你就不需要三次傳球了。我們沒有處理隨着輸入大小而增加的許多通行證。 – user2357112

相關問題