在我的编程课中,我们遇到了一个练习题,其中目标是如果数字相等则用零替换列表中两个连续数字中的第二个。
例如:
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'"
答案 0 :(得分:2)
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,否则它将保持不变)。
答案 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
答案 2 :(得分:0)
请注意,如果多个值相同,您的方法也不会起作用,我建议您创建一个新列表,这样就不会与可能更改的值进行比较。我建议使用itertools.groupby
,这似乎非常适合这种情况:
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]
答案 3 :(得分:0)
你可以这样试试,
getFolder() {
local __myResultFolder=$1
local folder
for d in */ ; do
folder=$d
done
__myResultFolder=$folder
echo "$folder"
}
folderName=$(getFolder FOLDER)
echo "$folderName"
输出:
def zero_duplicates(nums):
items = []
for item in nums:
if item not in items:
items.append(item)
else:
items.append(0)
return items
vals = [1, 5, 2, 7, 7]
print zero_duplicates(vals)
其他信息:
函数名称应为小写,并根据需要用下划线分隔,以提高可读性。
只有在已经是主流风格(例如threading.py)的上下文中才允许使用mixedCase,以保持向后兼容性。