2011-06-07 79 views
5

我想循環一個列表並刪除元素,如果它符合要求。同時,我會轉換已移除的元素並將轉換結果添加到另一個列表中。什麼應該是實現以下邏輯的pythonic方式?

delete_set = set([]) 

for item in my_list: 
    if meet_requirement(item): 
     another_list.append = transform(item) 
     delete_set.add(item) 

my_list = filter(lambda x:x not in delete_set, my_list) 

的代碼不是那麼直接,有沒有實現邏輯更好的辦法:

現在,我在上面的邏輯通過下面的代碼來實現?

+1

雖然我不同的寫(貓加上另外的方式可能),我看不出有什麼毛病你的方法。 – 2011-06-07 13:20:10

回答

6

您可以僅通過理解來做到這一點。

delete_set = set(I for I in my_list if meet_requirement(I)) 
another_list.extend(transform(I) for I in delete_set) 
# or extend(transform(I) for I in my_list if I in delete_set), if duplicates/order matter 
my_list = [I for I in my_list if I not in delete_set] 
+0

請注意,這會改變'another_list'中項目的順序。 – 2011-06-07 13:20:06

+0

淺拷貝的時間? '[:]' – 2011-06-07 14:03:25

1

你能做到這一點,以避免設置:

def part(items, others): 
    for item in items: 
     if meet_requirement(item): 
      others.append(item) 
     else: 
      yield item 

mylist[:] = part(mylist, another_list) 
0
>>> another_list = [] 
>>> new_list = [] 
>>> 
>>> for item in my_list: 
...  (another_list if meet_requirement(item) else new_list).append(item) 
... 
>>> another_list = map(transform, another_list) 
>>> my_list = new_list 
3

不知道關於Python的,但如果蟒蛇有類似於Haskell這樣的partition函數(或者你可以自己寫一個簡單的),代碼將不需要兩次迭代原始列表(如在Cat Plus的解決方案中)。

我會使用類似以下內容:

new_my_list, deleted_list = partition(my_list, meet_requirement) 
deleted_list = [transform(e) for e in deleted_list] 
+0

+1分區的想法 – 2011-06-07 13:36:29

1

你能做到這一點

for i in reversed(xrange(len(my_list))): 
    if meet_requirement(my_list[i]): 
     another_list.append(transform(my_list.pop(i))) 

,那麼你可能會或可能不會要扭轉another_list(或者你可以使用一個dequeappendleft

0
zipped = zip(*[(item, transform(item)) for item in my_list \ 
               if meet_requirement(item)]) 
another_list = zipped[1] 
my_list = [item for item in my_list if item not in zipped[0]] 
0

我需要類似的東西其他d AY:

def partition(pred, iterable): 
    result = ([], []) 
    for each in iterable: 
     result[pred(each)].append(each) 
    return result 

xs = some_list  
ys, xs[:] = partition(meet_some_requirement, xs) 
ys = map(do_some_transformation, ys) 

或者這一次通過的變化:

def partition_and_transform(pred, iterable, *transform): 
    result = ([], []) 
    for each in iterable: 
     v = pred(each) 
     result[v].append(transform[v](each)) 
    return result 

ys, xs[:] = partition_and_transform(meet_some_reqirement, xs, do_some_transformation, lambda x:x) 
相關問題