-1

リストがリストのリストを返す関数をPythonで作成します。このリストでは、すべての要素が指定されたリストから1つ減らされます。

Input:  list_decreaser([0,3,4,5,6,7,8)

Output: [[0,3,4,5,6,7],[0,3,4,5,6],[0,3,4,5],[0,3,4],[0,3],[0]] 

私の試み:

 def list_decreaser(list):  
      listresult = [] 
      for x in range(len(list)-1):
          list.remove(list[x])  
          listresult.append(list) 
      return listresult
4

3 に答える 3

2

コードは同じリストを複数回追加します。リストのコピーを追加する必要があります。

特定のインデックスでアイテムを削除するdel list[..]代わりに使用します。list.remove(list[..])

def list_decreaser(xs):
    listresult = [] 
    for i in range(len(xs)-1, 0, -1): # <--- interate backward
        del xs[i]
        listresult.append(xs[:]) # <----
    return listresult

print(list_decreaser([0,3,4,5,6,7,8]))

またはリスト内包表記を使用します。

>>> xs = [0,3,4,5,6,7,8]
>>> [xs[:i] for i in range(len(xs)-1, 0, -1)] 
[[0, 3, 4, 5, 6, 7], [0, 3, 4, 5, 6], [0, 3, 4, 5], [0, 3, 4], [0, 3], [0]]

listところで、変数名として使用しないでください。組み込みlist関数をシャドウします。

于 2013-11-11T08:28:37.747 に答える
0

問題は、同じリストを何度も追加していることです。リストをインプレースで変更し続けますが、新しいリストを作成することはありません。したがって、同じ空のリストへの N 参照のリストになります。

これは、FAQ の 2 つの質問で説明されている問題と同じです。多次元リストを作成するにはどうすればよいかが最もよく説明されていると思います。

とにかく、ループのたびに新しいリストを追加する必要があります。これには 2 つの方法があります。

まず、リスト自体ではなく、現在のリストのコピーを追加できます。

def list_decreaser(list):  
      listresult = [] 
      for x in range(len(list)-1):
          list.remove(list[x])
          listresult.append(list[:]) # this is the only change
      return listresult

これで問題は解決しますが、いくつかの新しい問題が残ります。

まず、list.remove(list[x])非常に悪い考えです。たとえば、 を与えた場合、[0, 1, 2, 0]その秒を削除しようとするとどうなります0か? あなたは を呼び出していますが、あなたが1 番目ではなくlist.remove(0)2 番目を望んでいることをリストが知る方法はありません! 0正しいことは、del list[x]またはを呼び出すことlist.pop(x)です。

しかし、それを修正すると、間違った側から要素を削除することになります. xは 0、次に 1、次に 2 などです。要素 0、要素 1 (元の要素 2)、要素 2 (元の要素 4) を削除し、最終的にIndexError. 「インデックスをスキップする」問題 (どこかの FAQ でも説明されています) を修正したとしても、最後の要素ではなく最初の要素を削除することになります。範囲を変えることで修正できます。xただし、さらに簡単な方法があります。どちらが正しいかを判断しようとする代わりに、毎回最後の要素を削除するだけです。指定するか、引数なし-1で呼び出します。popそして、もっと単純なループも使用できます。

def list_decreaser(list):  
      listresult = [] 
      while list:
          list.pop()
          listresult.append(list[:])
      return listresult

もちろん、これは最後の空のリストを追加しますが、これは明らかに望まなかったものです。while len(list) >= 1を実行するか、 を配置するif list: listresult.append(list[:])か、または他のさまざまな方法で修正できます。


または、同じリストを何度も切り捨ててコピーする代わりに、新しい切り捨てられたリストを作成できます。

def list_decreaser(list):  
      listresult = [] 
      while len(list):
          list = list[:-1]
          listresult.append(list)
      return listresult

この 2 番目のバージョンでは、 に保存されている値を変更するのではなくlist、新しいリストを作成して、その新しいリストを に保存していることに注意してくださいlist

于 2013-11-11T08:41:42.530 に答える