如何编写一个函数,将列表中除最大值之外的所有元素复制到另一个列表中? Python 3.2

时间:2012-12-17 03:33:35

标签: python list function copy

我正试图在练习测试中回答这个问题:

编写一个函数def def(x,y),它将列表x中除最大值之外的所有元素复制到列表y中。

我能想到的最好的事情是:

def eliminate(x, y):
    print(x)
    y = x
    big = max(y)
    y.remove(big)
    print(y)
def main():
    x = [1, 3, 5, 6, 7, 9]
    y = [0]
    eliminate(x, y)
main()

如果这样的问题出现在我的决赛中,我不认为会削减它,而且我很确定我不应该用它来编写一个主要功能,只是消除它。那我该怎么回答呢? (请记住,这是一个入门课程,我不应该使用更高级的编码)

2 个答案:

答案 0 :(得分:2)

我可能会这样做:

def eliminate(x, y):
    largest = max(x)
    y[:] = [elem for elem in x if elem != largest]

这会将yx中的所有元素一起填充,除非是最大的元素。例如:

>>> x = [1,2,3]
>>> y = []
>>> eliminate(x, y)
>>> y
[1, 2]
>>> x = [7,10,10,3,4]
>>> eliminate(x, y)
>>> y
[7, 3, 4]

这假定通过“副本”,问题是要求替换y的内容。如果要将x的非最大元素附加到y,则可以使用y.extend

请注意,您的版本不处理多个元素具有最大值的情况(例如[1,2,2]) - .remove()仅删除其中一个参数,而不是所有参数。< / p>

答案 1 :(得分:0)

为了找到列表中的最大数字,您需要遍历该列表并跟踪该路径中最大的元素。有几种方法可以实现这一目标。

所以这段代码回答了这个问题:

y.extend([n for n in x if n != max(x)])

但我担心它可能无法解决您的问题,即了解其工作原理和原因。这是代码扩展为一种非常直接的方式,只用于循环和if语句。

def trasfer_all_but_largest(transfer_from_list, transfer_to_list):

    current_index = 0
    index_of_current_largest_element = 0
    largest_element_so_far = None

    for element in transfer_from_list:
        if current_index == 0:
            largest_element_so_far = element
        else:
            if element > largest_element_so_far:
                largest_element_so_far = element
                index_of_current_largest_element = current_index
        current_index = current_index + 1

    index_of_largest_element = index_of_current_largest_element

    current_index = 0 # reset our index counter

    for element in transfer_from_list:
        if current_index == index_of_largest_element:
            continue # continue means keep going through the list
        else:
            transfer_to_list = transfer_to_list + [element]

        current_index = current_index + 1

    return transfer_to_list

list_with_large_number = [1, 2, 100000]
list_were_transfering_to = [40, 50]

answer_list = trasfer_all_but_largest(list_with_large_number, list_were_transfering_to)
print(answer_list)