2009-11-24 11 views
11

リストをPythonで使用している場合、リストの一部への参照を作成するにはどうすればよいですか?例:リストの一部を参照する - Python

myList = ["*", "*", "*", "*", "*", "*", "*", "*", "*"] 

listPart = myList[0:7:3] #This makes a new list, which is not what I want 

myList[0] = "1" 

listPart[0] 

"1" 

これは可能でしょうかもしそうなら、私はそれをどのようにコード化しますか?

乾杯、 ジョー

+0

http://stackoverflow.com/questions/3485475/can-i-create-a-view-on-a-python-list –

答えて

1

私はそれは不可能だと思います。多くのエラーが発生する可能性があります。たとえば、大きなリストの一部を参照するリストを追加するときはどうなりますか?ビッグリストの次の要素を置き換えるか挿入するか?

私が知る限り、サイレンスはリストの要素を取得するための内部メカニズムです。古いリストオブジェクトの一部を参照して新しいリストオブジェクトを作成することはありません。 Isliceはスライスによって与えられた要素を反復するだけでなく、参照でもありませんが、実際のオブジェクトは元のリストには影響しません。または私は間違っていますか?コメントのように

、及びそのソリューションは、氏バスティアンに本当に貢献し、あなたが行うことができます:

sliceobject = slice(0,7,3) 
for i in xrange(sliceobject.start, sliceobject.stop, sliceobject.step) 
    myList[i] = whatever 

あなたが参照して、リストの各指定された要素にアクセスすることができる方法。

+0

私はあなたが正しいと思います。しかし私には、タプル(リスト、スライス)のようなものがOPのニーズに合っているようです。うまくいけば、 –

+0

。他のオプションは、手でスライスを使用している可能性があります(xrangeのi(sliceobject.start、sliceobject.stop、sliceobject.step)mylist [i] = whatever) –

2

Pythonには、本当に必要なことは何もありません。基本的には、ある種のプロキシオブジェクトを記述したいとします。

3

リストビュータイプを書くことができます。ここで私は実験として書かれている何かがある、それは完全またはバグのない

class listview (object): 
    def __init__(self, data, start, end): 
     self.data = data 
     self.start, self.end = start, end 
    def __repr__(self): 
     return "<%s %s>" % (type(self).__name__, list(self)) 
    def __len__(self): 
     return self.end - self.start 
    def __getitem__(self, idx): 
     if isinstance(idx, slice): 
      return [self[i] for i in xrange(*idx.indices(len(self)))] 
     if idx >= len(self): 
      raise IndexError 
     idx %= len(self) 
     return self.data[self.start+idx] 
    def __setitem__(self, idx, val): 
     if isinstance(idx, slice): 
      start, stop, stride = idx.indices(len(self)) 
      for i, v in zip(xrange(start, stop, stride), val): 
       self[i] = v 
      return 
     if idx >= len(self): 
      raise IndexError(idx) 
     idx %= len(self) 
     self.data[self.start+idx] = val 


L = range(10) 

s = listview(L, 2, 5) 

print L 
print s 
print len(s) 
s[:] = range(3) 
print s[:] 
print L 

出力であることが保証されるものではない:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
<listview [2, 3, 4]> 
3 
[0, 1, 2] 
[0, 1, 0, 1, 2, 5, 6, 7, 8, 9] 

あなたはリストビュー内のインデックスに割り当てることができ、そしてそれは意志基本的なリストに反映されます。ただし、リストビューに追加または類似のアクションを定義するのは意味がありません。基礎となるリストの長さが変更された場合は、破損することもあります。