3

Google の Python クラスから

#!/usr/bin/python -tt
# Copyright 2010 Google Inc.
# Licensed under the Apache License, Version 2.0
# http://www.apache.org/licenses/LICENSE-2.0

# Google's Python Class
# http://code.google.com/edu/languages/google-python-class/

# Additional basic list exercises

# D. 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):
  x = 0
  newlist = []
  for x in range(0,len(nums),1):
    if nums[x] == nums[x+1]:
      newlist.append(nums[x])
      x = x+2
    else:
      newlist.append(nums[x])
      x = x+1

  return nums

リストのインデックスが範囲外であるというエラーが表示されますが、何が問題なのかわかりません。forループを使用して反復しているときにリスト内の値を置き換えることができないことをどこかで読みましたが、それを修正する方法がわかりません。アドバイスをいただければ幸いです。

4

4 に答える 4

4

nums[x+1]圏外になったことが原因と考えられます。xが から にのみ移動する0ことをlen(nums) - 1意味するのは、 が の場合xlen(nums)-1基本的にnums[len(nums)]の末尾の 1 つ後ろにインデックスを作成することですnums(空でないリストの最後のインデックスは1、 からインデックスを数え始めるため、その長さよりも短いことに注意してください0)。

于 2013-06-14T02:01:53.557 に答える
2

x+1x が最後の要素のインデックスである場合、インデックスは範囲外になります。さらに、新しいリストを作成していますが、古いリストを返します。

の値を変更しても、ループの反復ごとにリセットさxれるため、思ったとおりにはなりません。

別の実装を次に示します。

def remove_adjacent(nums):
  newlist = []
  for i in range(0, len(nums)):
    if i == len(nums) - 1:      # Avoid out of range error.
      newlist.append(nums[i])
    elif nums[i] == nums[i+1]:  # Skip until the last repeat
      continue
    else:  
      newlist.append(nums[i])
  return newlist    
于 2013-06-14T02:12:25.937 に答える
2

zip とリスト内包表記を使用してこれを行うこともできます。

def remove_adjacent(nums):
    return [n[0] for n in zip(nums, nums[1:]) if n[0] != n[1]]
于 2013-06-14T02:27:14.933 に答える
2

x+1リストの最後の要素でインデックスが範囲外になり、そのインデックスはlen(nums)-1-- there is nonums[len(nums)]です。

モジュールでgroupby()関数を使用するのは非常に簡単です。itertools

from itertools import groupby

def remove_adjacent(nums):
    return [k for k, _ in groupby(nums)]

print remove_adjacent([1, 2, 2, 2, 3])

出力:

[1, 2, 3]
于 2013-06-14T02:49:59.853 に答える