0

私が求めていることが可能かどうかはわかりませんが、可能であれば特定のアプリケーションに便利です。ターゲットが素数と正確に一致するか、ターゲットとの特定の関係を維持する特定の方法で不一致になるかのいずれかである、実験用の試行リストを作成しています。さらに明確にするために、私の刺激はすべて、次の形式の 3 レベルの分類法に分類されます。

H = {
    'A1':{
        'B1':{
            'C1':[],'C2':[],'C3':[] },
        'B2':{
            'C1':[],'C2':[],'C3':[] },
        'B3':{
            'C1':[],'C2':[],'C3':[] }
    },
    'A2':{
        'B1':{
            'C1':[],'C2':[],'C3':[] },
        'B2':{
            'C1':[],'C2':[],'C3':[] },
        'B3':{
            'C1':[],'C2':[],'C3':[] }
    }
}

一番下の「ツリー」の各リストは、特定の刺激のセットです。素数とターゲットが一致する場合、それは簡単です。そうでない場合は、同じ B グループの下にある別の C グループから、置換せずにランダムに描画したいと考えています。

私の意図した解決策は、Pythonが参照を処理する方法を活用し、そこから刺激を pop() できる一時的なリストを作成することでした。したがって、試行が一致せず、素数が H[A1][B1][C1] からのものである場合、リストから pop() を使用したいと思います。

tempList = H[A1][B1][C2] + H[A1][B1][C3]

ただし、おそらく2つのリストを追加しているため、辞書内のリストへの参照が壊れているため、一時リストからidemを削除すると、辞書に反映されません。参照を維持する方法はありますか?ありがとうございました!

編集: このおもちゃの例は期待どおりに動作しません:

>>> d = {'A':[1,2,3],'B':[4,5,6]}
>>> l = d['A'] + d['B']
>>> l
[1, 2, 3, 4, 5, 6]
>>> l.pop(2)
3
>>> l
[1, 2, 4, 5, 6]
>>> d
{'A': [1, 2, 3], 'B': [4, 5, 6]}
4

2 に答える 2

7

初期化子でサブリストへのパスとパスを取る新しいクラスを作成し、代わりに基になるリストが影響を受けるようにHオーバーライドします。__*item__()

編集:

部分的な例:

class listxer(object):
  def __init__(self, structure, paths):
    self.structure = structure
    self.paths = paths

  def _descend(self, path):
    return reduce(lambda x,y: x[y], path, self.structure)

  def __len__(self):
    return sum(len(self._descend(path)) for path in self.paths)

  def __getitem__(self, item):
    if item < 0:
      raise ValueError('negative indices not supported!')
    for path in self.paths:
      cur = self._descend(path)
      if item > len(cur):
        item -= len(cur)
        continue
      else:
        return cur[item]
    else:
      raise IndexError('list index out of range')

H = [[[1, 2], [3, 4, 5]]]

mystruct = listxer(H, ((0, 0), (0, 1)))
print len(mystruct)
print mystruct[3]
于 2012-04-13T18:19:34.833 に答える
1

専門的な解決策を提供するのは難しいですが、下線の付いた質問への回答を提供しようと思います

2 つのリスト A と B が与えられた場合、次のようなリスト C を生成する方法

C = A + Bの場合

C を変更すると、最終的に A または B のいずれかが変更されます。

次の例を見てください

それ自体が数値のリストである 2 つのリスト A と B を作成します。

>>> A=[[i] for i in range(0,10)]
>>> B=[[i] for i in range(10,20)]

次に、それらを追加します。

>>> C=A+B

ここで、その要素を変更するCと、変更されるAか、B

>>> C[1][0]=-1
>>> C
[[0], [-1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19]]
>>> A
[[0], [-1], [2], [3], [4], [5], [6], [7], [8], [9]]
>>> C[11][0]=-1
>>> C
[[0], [-1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [-1], [12], [13], [14], [15], [16], [17], [18], [19]]
>>> B
[[10], [-1], [12], [13], [14], [15], [16], [17], [18], [19]]
>>> 
于 2012-04-13T18:28:58.877 に答える