为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕容3067478 2024-01-04 17:29:15
我有一个包含 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>现在我想将所有第四个元素打印为1 to many关系类型。更具体地说,fps[n][3]将打印所有其余元素2005(仅第四列),依此类推。所以我写了这个for n in range(len(fps)-1):   print(fps[n][3], fps[n+1:][3]) #Can I use for mapping但是,我的代码对于第一次打印没有问题,但对于第二次打印却出现错误。第二个给出整体2d list。输出看起来像    <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_2element_1 element_3 element_1 element_4........element_1 element_2006element_2 element_1element_2 element_3......可以用这种方式打印吗?
查看完整描述

2 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

代码“print(fps[n][3], fps[n+1:][3])”将首先打印主/父列表的元素 [n[ 的子列表的索引 [3] 处的元素。但之后,它将打印剩余的父列表,如代码所示“[n+1:]”。分号告诉程序从元素 n+1 开始获取列表直到末尾。相反,尝试运行嵌套循环来打印一对多关系,例如:


for one in fps:

    for many in fps:

        print(one[3], many[3])

外循环将从主列表中获取一个元素并将其传递给内循环。内部循环将保留从外部循环传递的初始元素,并从主循环中获取每个元素并打印两者的第三个元素,直到每个元素完成为止。然后,外循环将下一个元素传递给内循环,依此类推。


查看完整回答
反对 回复 2024-01-04
?
倚天杖

TA贡献1828条经验 获得超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


因此,您的代码中至少存在以下两个问题:fps[n:][3]您没有选择子列表的“第4项”,而是选择源列表的“第4项”,并且当“n”大于最后一项时你得到的索引IndexError: list index out of range。


对于+1中的部分fps[n+1:][3],也许您增加是n因为您想跳过“one”元素,以避免打印“element_1 element_1”或“element_2 element_2”?


查看完整回答
反对 回复 2024-01-04
  • 2 回答
  • 0 关注
  • 58 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信