Google Python类|列表练习-
Given a list of numbers, return a list where all adjacent == elements have been reduced to a single element, so [1, 2, 2, 3] returns [1, 2, 3]. You may create a new list or modify the passed in list.
我使用新列表的解决方案是-
def remove_adjacent(nums):
a = []
for item in nums:
if len(a):
if a[-1] != item:
a.append(item)
else: a.append(item)
return a
这个问题甚至表明可以通过修改传入列表来完成。但是,python文档警告不要在使用for循环迭代列表时修改元素。
我想知道除了遍历列表之外,我还能尝试什么来完成这项工作。我不是在寻找解决办法,但也许一个提示可以带我进入一个正确的方向。
更新
-用建议的改进更新了上述代码。
-使用建议的提示尝试使用while循环执行以下操作-
def remove_adjacent(nums):
i = 1
while i < len(nums):
if nums[i] == nums[i-1]:
nums.pop(i)
i -= 1
i += 1
return nums
以下是传统的方法,在原地删除相邻的重复项,同时向后遍历列表:
更新:如果您想要一个生成器,但是(没有
itertools.groupby
或(您键入的速度可能比读取其文档和了解其默认行为的速度还快),这里有一个六行程序:更新2:关于巴洛克风格
itertools.groupby()
和极简主义object()
。。。要从
itertools.groupby()
中获得重复数据消除相邻效果,需要围绕它包装一个列表理解,以丢弃不需要的分组:。。。或者用
itertools.imap
和/或operators.itemgetter
乱搞,如另一个答案所示。使用
object
实例的预期行为是,没有一个实例与任何类的任何其他实例进行比较,包括object
本身。因此他们是非常有用的哨兵。值得注意的是,
itertools.groupby
的Python reference code使用object()
作为哨兵:当你运行代码时,它会做正确的事情:
更新3:前向索引原位操作说明
OP的修订代码:
最好写成:
使用生成器迭代列表中的元素,并且
yield
只有在列表发生更改时才使用新的元素。^{} 正是这样做的。
如果在副本上迭代,则可以修改传入列表:
这里再说明一个没有索引的单行程序版本:
not部分将最后一个值放入result,因为只有a结束于result。
相关问题 更多 >
编程相关推荐