如何在python中打印2D列表中的1到多个项目



我有一个包含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"?

最新更新