【问题标题】:How to write a function where the original list of integers is changed without using return?如何编写一个函数,在不使用返回的情况下更改原始整数列表?
【发布时间】:2017-12-05 19:27:37
【问题描述】:

假设我们有一个整数列表:

列表 = [6, 4, 1, 4, 4, 4, 4, 4, 2, 1]

我现在写了一个函数,它返回另一个列表,其中包含上面列表中的所有整数,没有重复。

def no_repeats(s):
    new_list = []
    for number in s:
        if new_list.count(number) < 1:
            new_list.append(number)
    return(new_list)

new_list 返回 [6, 4, 1, 2] 这很好!我的问题是我现在如何编写两个类似的函数:

一个函数 clean(s) 不会像上面的函数那样返回一个新列表,而是通过删除所有重复的数字来更改原始列表。因此,结果必须相同,并且函数不得包含“return”或创建新列表。它只能清理原始列表。

一个 double(s) 函数,它再次更改原始列表(不返回新列表!),但这次是通过将原始列表中的每个数字加倍。因此,double(list) 应该将上面的原始列表更改为:

[6, 6, 4, 4, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 1, 1]

感谢大家的帮助!

【问题讨论】:

  • 此答案在很大程度上取决于您实施解决方案所使用的特定语言。请编辑您的标签以使其相关。
  • 抱歉,已更正。语言是python 3+。

标签: python-3.x list function integer return


【解决方案1】:

在不保留顺序的情况下就地删除重复项:

def no_repeats(L):
    L[:] = set(L)

several variations possible(保留顺序,支持不可散列项,支持不定义总排序的项)例如,保留顺序:

from collections import OrderedDict

def no_repeats(L):
    L[:] = OrderedDict.fromkeys(L)

将每个元素的值加倍:

def double(L):
    for i in range(len(L)):
        L[i] *= 2

复制每个元素:

def duplicate_elements(L):
    L[:] = [x for x in L for _ in range(2)]

【讨论】:

    【解决方案2】:
    >>> def clean(s):
    ...     s[:] = [s[i] for i in range(len(s)) if s[i] not in s[:i]]
    ... 
    >>> st = [1, 2, 3, 2, 1]
    
    >>> clean(st)
    >>> st
    [1, 2, 3]
    
    >>> def double(s):
    ...     s[:] = [s[i//3] for i in range(3*len(s)) if i % 3]
    ... 
    >>> st = [1, 2, 3, 2, 1]
    >>> double(st)
    >>> st
    [1, 1, 2, 2, 3, 3, 2, 2, 1, 1]
    

    既不是特别有效也不是pythonic,但确实解决了OP问题

    def 双精度: ... s[:] = [s[i//2] for i in range(2*len(s))]

    也能做到这一点,少一点困惑

    【讨论】:

    • 这是一个相当有趣的代码 ShpielMeister!非常感谢。你能否详细说明你在第二个函数中做了什么?我想知道你做了什么。 :)
    • 还有一个权宜之计,我们只需要“慢慢地”通过列表运行。可以更进一步。无论 i 是 4 还是 5,i//2 都会给出相同的结果。我会添加到答案中
    猜你喜欢
    • 2013-06-12
    • 2010-12-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 2021-06-09
    • 1970-01-01
    相关资源
    最近更新 更多