如何在列表中替换数字?

2024-03-28 08:32:32 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的编程课上,我们有一个练习问题,目标是用一个0替换列表中两个连续数字中的第二个,如果这些数字相等的话。你知道吗

例如:

def zeroDuplicates([1,5,2,7,7])将输出[1,5,2,7,0]

然而,当我尝试这样做,我总是得到一个错误。 到目前为止,我掌握的情况如下:

def zeroDuplicates(nums):
    count =0
    for n in nums:
        if n == nums[n-1]:
             nums.replace[n,0]
    return nums

运行此程序时出现错误消息:

"Error: 'list' object has no attribute 'replace'"

Tags: in目标列表forreturnifdef编程
3条回答

n是示例中的元素,而不是索引。如果某个元素等于其索引值为负1的元素,则作为伪代码的程序将替换该元素。你知道吗

让您的问题更明确(机器人友好):您希望从1迭代到列表的长度,如果当前元素等于前一个元素,则将其替换为零。你知道吗

现在让我们把英语翻译成Python(我们用i表示索引):

def zeroDuplicates (nums):
    for i in range(1, len(nums)):
         if nums[i] == nums[i-1]:
             nums[i] = 0
    return nums

好处:您可以使用列表理解和压缩来“pythonize”它:

def zeroDuplicates (nums):
    return [nums[0]] + [(0 if a == b else a) for a, b in zip(nums[1:], nums[:-1])]

(对于每个元素及其后续元素,如果它们等于,则后续元素等于0,否则将保持不变)。你知道吗

请注意,如果几个值相同,您的方法也不起作用,我建议您创建一个新列表,这样您就不会与可能更改的值进行比较。我建议使用^{},这在本例中似乎非常合适:

from itertools import groupby

res = []
for item, group in groupby([1,2,3,3,3,3,2,1]):
    identicals = list(group)
    # Append the item
    res.append(item)
    # Extend the list with x zeros where x is the number of successive duplicates
    res.extend([0] * (len(identicals) - 1))

>>> res
[1, 2, 3, 0, 0, 0, 2, 1]

您还有一个上面的代码无法处理的问题

如果重复值不是发生在索引-1位置,而是发生在索引-1位置之前,会怎么样?你知道吗

values = [1,5,7,2,7,7]

values_added = set()
new_values = []

for val in values:
    if val in values_added:
        new_values.append(0)
    else:
        new_values.append(val)
        values_added.add(val)

print(values_added)

print(new_values)

输出:

{1, 2, 5, 7} # values_added
[1, 5, 7, 2, 0, 0] # new_values

相关问题 更多 >