提问者:小点点

根据条件拆分列表,对子列表应用函数,在Python中按原始顺序组合


我有一个包含不同种类元素的列表。 我需要拆分列表根据他们的种类在子列表(这里开始'A'或'B',所以2子列表)。

l = ['a1', 'b1', 'a2', 'a3', 'b2', 'b3']

然后分别处理这些子列表。 处理的结果(例如对服务器的远程调用)同样是两个长度相同的列表。 我只想进行2次调用,而不是n=len(l)调用,因为这样开销要小得多。

接下来,我得把这些清单按照原来的顺序重新拼在一起。

# original list
l = ['a1', 'b1', 'a2', 'a3', 'b2', 'b3']
# sublists which need to be processed separately
sl1 = [item for item in l if item.startswith('a')]
sl2 = [item for item in l if not item.startswith('a')]
# expensive call to server
f1 = lambda l: [x + '_calc1' for x in l ]
f2 = lambda l: [x + '_calc2' for x in l ]

sr1 = f1(sl1)
sr2 = f2(sl2)

# rebuild list according to original order
a = iter(sr1)
b = iter(sr2)
l_result = [next(a) if x.startswith('a') else next(b) for x in l]
# >> ['a1_calc1', 'b1_calc2', 'a2_calc1', 'a3_calc1', 'b2_calc2', 'b3_calc2']

我现在做的方式感觉非常笨拙,我希望有‘Pythonic’的方式来做这些拆分-应用-组合。


共1个答案

匿名用户

这个怎么样:

# original list
l = ['a1', 'b1', 'a2', 'a3', 'b2', 'b3']
# sublists which need to be processed separately
sl1 = [item for item in l if item.startswith('a')]
sl2 = [item for item in l if not item.startswith('a')]

sr1 = map(lambda x: x+'_calc1', sl1)
sr2 = map(lambda x: x+'_calc2', sl1)

# rebuild list according to original order
a = iter(sr1)
b = iter(sr2)
l_result = [next(a) if x.startswith('a') else next(b) for x in l]
# >> ['a1_calc1', 'b1_calc2', 'a2_calc1', 'a3_calc1', 'b2_calc2', 'b3_calc2']