我有一个包含4个项目的2D列表对象fps
,该对象的长度为2006(2006行,每行包含4个元素(。对象看起来像
['0012', 'CCN[C@H]1CN', <rdkit.Chem.rdchem.Mol object at 0x7fea177a0260>, <rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7fea0f2fd030>]
['0015', 'CCN[H@H]1CN', <rdkit.Chem.rdchem.Mol object at 0x7fea177a0260>, <rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7fea0f2fd030>]
... so on
我只想打印4th items
。所以我的代码是
for n in range(len(fps)-1):
print(fps[n][3])
输出看起来像
<rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7fcfa09f3170>
<rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7fcfa09f31c0>
<rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7fcfa09f3210>
现在,我想将所有第4个元素打印为1 to many
关系类型。更具体地,fps[n][3]
将与所有其余的2005
元素(仅第4列(一起打印,依此类推。所以我写了这个
for n in range(len(fps)-1):
print(fps[n][3], fps[n+1:][3]) #Can I use for mapping
但是,我的代码在第一次打印时很好,但在第二次打印时出现了错误。第二个给出了整个CCD_ 6。输出看起来像
<rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7fde5df8f300> ['00299', 'Nc1nc(=O)c2ncn(CCC(CO)CO)c2[nH]1', <rdkit.Chem.rdchem.Mol object at 0x7fde5dfde530>, <rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7fde5df8f440>]
<rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7fcfa09f34e0> ['15617', 'OC[C@H](O)[C@@H](O)[C@H](O)[C@H](O)CO[C@H]1O[C@H](CO[C@H]2O[C@H](CO)[C@@H](O)[C@H](O)[C@H]2O)[C@@H](O)[C@H](O)[C@H]1O.[Fe+3]', <rdkit.Chem.rdchem.Mol object at 0x7fcfa0a455d0>, <rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7fcfa09f3620>]
我的预期输出像
<rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7fcfa09f3170> <rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7fcfa09f31c0>
<rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7fcfa09f3170> <rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x7fcfa09f3210>
对于更一般的方式,我的预期输出
element_1 element_2
element_1 element_3
element_1 element_4
........
element_1 element_2006
element_2 element_1
element_2 element_3
可以用这种方式打印吗?
代码"打印(fps[n][3]、fps[n+1:][3](";将首先在主/父列表的元素[n]的子列表的索引[3]处打印元素。但在那之后,它将按照代码所说的"[n+1:]"打印剩余的父列表;。分号告诉程序将列表从元素n+1一直带到末尾。相反,试着运行一个嵌套循环来打印一个1-many关系,比如:
for one in fps:
for many in fps:
print(one[3], many[3])
外部循环将从主列表中获取一个元素,并将其传递给内部循环。内循环将保持从外循环传递的初始元素,并从主循环中获取每个元素,并打印两者的第三个元素,直到每个元素都完成为止。然后,外循环将把下一个元素传递给内循环,依此类推
如果您想要的是这样的列表:
fps = [[0,0,0,1], [0,0,0,2], [0,0,0,3], [0,0,0,4]]
您的预期输出应该是:
1 2
1 3
1 4
----------
2 1
2 3
2 4
----------
3 1
3 2
3 4
----------
4 1
4 2
4 3
----------
所以你可以这样做:
fps = [[0,0,0,1], [0,0,0,2], [0,0,0,3], [0,0,0,4]]
for index_i,i in enumerate(fps):
one_fourth_item = i[3]
for index_j,j in enumerate(fps):
many_fourth_item = j[3]
if index_i != index_j:
print(one_fourth_item, many_fourth_item)
print("----------")
我将尝试用你称之为";第二个";在您的问题(fps[n+1:][3]
(中:
首先,将其简化为fps[n:][3]
部件fps[n:]
将返回源列表的一个切片。
因此:
对于n=0:[[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 0, 3], [0, 0, 0, 4]]
对于n=1:[[0, 0, 0, 2], [0, 0, 0, 3], [0, 0, 0, 4]]
对于n=2:[[0, 0, 0, 3], [0, 0, 0, 4]]
对于n=3:[[0, 0, 0, 4]]
部分[3]
将返回切片的第三个元素(来自fps[n:]
(
因此,对于n=0,fps[n:][3]
等于:[[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 0, 3], [0, 0, 0, 4]][3]
,即[0,0,0,4]
问题是,对于n=1(在本例中(,最后一个索引是2,因此得到IndexError: list index out of range
因此,在您的代码中至少存在以下两个问题:使用CCD_;第4项";子列表的";第4项";并且当"是"时;n〃;大于您获得的最后一个索引IndexError: list index out of range
。
对于fps[n+1:][3]
中的+1
部分,也许您增加了n
,因为您想跳过";一个";元素,以避免打印";element_ 1 element_;或";element_2 element_2"?