如何编写一个函数,在不使用返回的情况下更改原始整数列表?
Posted
技术标签:
【中文标题】如何编写一个函数,在不使用返回的情况下更改原始整数列表?【英文标题】: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+。 【参考方案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 都会给出相同的结果。我会添加到答案中以上是关于如何编写一个函数,在不使用返回的情况下更改原始整数列表?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不更改原始内容的情况下操作 NSDictionary 内容的副本
有没有一种方法可以在不使用大量分支语句的情况下为无符号整数编写 qsort 比较函数?