如果符合要求,我想循环列表并删除元素。同时,我将转换已删除的元素并将转换结果添加到另一个列表中。
现在,我已通过以下代码实现了上述逻辑:
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)
代码不是那么简单,是否有更好的方法来实现逻辑?
答案 0 :(得分: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]
答案 1 :(得分:3)
不确定pythonic,但是如果python有一个类似于haskell的partition
函数(或者你自己可以写一个简单的函数),那么代码就不需要迭代原始列表两次了(就像在Cat中一样)加'解决方案'。
我会使用以下内容:
new_my_list, deleted_list = partition(my_list, meet_requirement)
deleted_list = [transform(e) for e in deleted_list]
答案 2 :(得分:1)
你可以这样做以避免设置:
def part(items, others):
for item in items:
if meet_requirement(item):
others.append(item)
else:
yield item
mylist[:] = part(mylist, another_list)
答案 3 :(得分: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
(或者您可以使用deque
和appendleft
)
答案 4 :(得分: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
答案 5 :(得分: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]]
答案 6 :(得分:0)
前几天我需要类似的东西:
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)