用于创建列表临时副本的 Pythonic 方法

Pythonic method for creating temporary copy of list

有没有更Python化的方式来做下面的事情(请原谅半伪代码)?

from copy import deepcopy
# Create a copy of a list edit an element within it
# then run a function using the new copy of the list
actuallist = [some data]
answer = 0
for i in len(actuallist):
    temp = deepcopy(actuallist)
    temp[i] = temp[i] + something
    tempplus = DoSomething(temp)
    temp = deepcopy(actuallist)
    temp[i] = temp[i] - something
    tempminus = DoSomething(temp)
    answer += OneMoreThing(tempplus, tempminus)

如果DoSomething不改变列表,你可以这样做:

answer = 0
for i in len(actuallist):
    tempplus = DoSomething(actuallist[:i] + [actuallist[i] + something] + actuallist[i+1:])
    tempminus = DoSomething(actuallist[:i] + [actuallist[i] - something] + actuallist[i+1:])
    answer += OneMoreThing(tempplus, tempminus)

但不管我们是使用列表的深拷贝还是只使用切片,我们都应该将通用功能捆绑到一个函数中:

def shift(target, index, shift_value):
    return target[:index] + [target[index] + shift_value] + target[i+index:]

answer = 0
for i in len(actuallist):
    tempplus = DoSomething(shift(actuallist, i, something))
    tempminus = DoSomething(shift(actuallist, i, -something))
    answer += OneMoreThing(tempplus, tempminus)

此时我们可以将该循环重写为:

answer = 0
for i in len(actuallist):
    answer += OneMoreThing(
        DoSomething(shift(actuallist, i, something)),
        DoSomething(shift(actuallist, i, -something))
    )

此时您实际上可以将其重写为生成器表达式,使用 sum 进行求和。

answer = sum(OneMoreThing(
    DoSomething(shift(actuallist, i, something)),
    DoSomething(shift(actuallist, i, -something))
) for i in len(actuallist))

虽然一次完成所有事情有点多。我可能会建议使用其他功能。

根据您提供的通用示例名称,我无法理解您的函数的性质,因此我无法确定如何最好地对其进行分组。不过你可以这样做:

def shift(target, index, shift_value):
    return target[:index] + [target[index] + shift_value] + target[i+index:]

def one_more_thing_for_index(actuallist, i, something):
    return OneMoreThing(
        DoSomething(shift(actuallist, i, something)),
        DoSomething(shift(actuallist, i, -something))
    )

answer = sum(one_more_thing_for_index(actuallist, i, something)
             for i in len(actuallist))

对于这些非常通用的名称,我认为这实际上可能不如您的示例清楚。但是,我认为您可以为您的特定问题域选择一些合乎逻辑的名称,这将使它更加自我记录。