Google Python类| 清单练习-
给定一个数字列表,返回一个列表,其中所有相邻的==元素都已简化为单个元素,因此[1、2、2、3]返回[1、2、3]。您可以创建一个新列表或修改传入的列表。
我使用新列表的解决方案是-
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
使用生成器遍历列表的元素,yield仅在更改后才使用新的生成器。
yield
itertools.groupby 确实做到这一点。
itertools.groupby
如果遍历副本,则可以修改传入列表:
for elt in theList[ : ]: ...