我不确定我所要求的是否可行,但如果是特定应用则会方便。我正在为一个实验建立一个试验列表,其中一个目标可以完全匹配一个素数,或者它可以是一种与目标保持某种关系的特定方式的不匹配。更明确的是,我所有的刺激都属于三级分类,形式如下:
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如何处理引用并创建一个临时列表,我可以从中弹出()一个刺激。因此,如果试验不一致,并且素数来自H [A1] [B1] [C1],我想从列表中弹出():
tempList = H[A1][B1][C2] + H[A1][B1][C3]
但是,大概是因为我附加了两个列表,对字典中列表的引用被破坏了,所以如果我从临时列表中删除一个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]}
答案 0 :(得分: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]
答案 1 :(得分:1)
虽然我很难提供专门的解决方案,但我会尽力给你解答你的下划线问题
给出两个清单,A&amp; B,如何生成List C这样
如果C = A + B
改变C最终会改变A或B.
采取以下示例
我创建了两个列表A&amp; 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]]
>>>