将函数应用于列表中的某些值

时间:2014-03-14 22:19:26

标签: python list list-comprehension

我有一个函数,它可以获取任务列表,创建线程并为每个任务解决复杂的任务。

为了简化,我们只说这是这个功能:

def efficient_function_that_only_takes_a_list(list):
return [-x for x in list]

现在,我需要做的就是拥有一个列表并将其提供给函数:

efficient_function_that_only_takes_a_list(my_list)

我现在的问题是我已经意识到并不是该功能需要处理列表中的所有项目。但我想保留订单,只处理其中的一些。这就是我想出来的。

任何人都有更多的pythonic方式?

my_list = [3,2,3,4,5,6,7,8,9]

def my_condition(x):
  return x%2 == 0 

def efficient_function_that_only_takes_a_list(list):
    return [-x for x in list]

#What I want: [1,-2,3,-4,5,-6,7,-8,9]

# My attempt:
def apply_to_some(mylist, condition, function):
    valid = [(i,x) for i,x in enumerate(mylist) if condition(x)]
    index, values = zip(*valid)
    results = function(values)
    for new_value, ix in zip(results,index):
        mylist[ix] = new_value
    return my_list

print apply_to_some(my_list, my_condition, efficient_function_that_only_takes_a_list) #=> [3, -2, 3, -4, 5, -6, 7, -8, 9]

编辑:我真的需要我的功能来获取列表而不是单个项目,因为我需要使其有效地运行,如本文所示:https://medium.com/p/40e9b2b36148

2 个答案:

答案 0 :(得分:4)

做以下事情会更简洁:

def apply_to_some(mylist, condition, function):
    return [function(x) if condition(x) else x for x in mylist]

虽然请注意此表单不会改变mylist

但是,如果您的高效功能依赖列表,除了一些只是减少行数的调整之外,您所拥有的内容并没有多大改进。

答案 1 :(得分:0)

或者如果列表推导让你头晕,请使用map:

def apply_to_some(mylist, condition, function):
    return map(lambda x: function(x) if condition(x) else x, mylist)