用于创建列表临时副本的 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))
对于这些非常通用的名称,我认为这实际上可能不如您的示例清楚。但是,我认为您可以为您的特定问题域选择一些合乎逻辑的名称,这将使它更加自我记录。
有没有更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))
对于这些非常通用的名称,我认为这实际上可能不如您的示例清楚。但是,我认为您可以为您的特定问题域选择一些合乎逻辑的名称,这将使它更加自我记录。