Python列表索引切割与操作

3
我的问题看起来很简单,但对于像我这样的Python新手来说,这开始变得太复杂了,所以情况如下:
我需要处理以下列表:
L = [(a, b, c), (d, e, d), (etc, etc, etc), (etc, etc, etc)]

并将每个索引都转换为单独的列表,以便我可以从每个索引中特定地提取元素。问题在于,我实际上正在处理的列表包含数百个类似上面的索引,我无法像这样创建:

L_new = list(L['insert specific index here'])

对于每个索引都创建一个列表会导致内存填满数百个对应于第一个列表的单独索引列表,从我的角度来看,这将耗费太多时间和内存。因此,我的问题是,如何分离这些索引并从中提取单个部分,而不需要创建数百个单独的列表(至少在我不需要数百个单独行来创建它们的程度上)。


5
你不需要做任何其他的事情,只需添加另一个索引就行了,这样就可以正常工作。L[0][0]将给出a,L[0][1]将给出b,L[2][1]将给出等等。 - Slater Victoroff
3个回答

3
我可能误解了你的问题,但我倾向于认为你实际上不需要做任何事情就能够索引你的元组。请看我的评论:L[0][0]将返回"a"L[0][1]将返回"b"L[2][1]将返回"etc"等等...
如果你真的想要一个干净的方法把它转换成一个列表的列表,你可以使用列表推导式:
cast = [list(entry) for entry in L]

作为对您评论的回应:如果您想跨越维度进行访问,我建议使用列表推导式。针对您的评论,具体来说:
crosscut = [entry[0] for entry in L]

作为对第二条评论的回应:这在很大程度上是切片操作的一部分。具体而言,要执行引用操作,您需要执行以下操作:
multiple_index = [entry[0:3] for entry in L]

根据您的可读性偏好,这里有许多可能性:

list_of_lists = []
for sublist in L:
    list_of_lists.append(list(sublist))

iterator = iter(L)
for i in range(0,iterator.__length_hint__()):
    return list(iterator.next())
    # Or yield list(iterator.next()) if you want lazy evaluation

这是一个不错的开始,因为我不知道这可以在Python中完成,所以感谢您提供的这点知识。但是我仍然想知道如何有效地调用(例如)L[:][0],这样是否可以从此列表中提取所有索引中的a(假设a是括号中的第一个索引,仅作为示例) - ImmortalxR
非常感谢,更新后的响应完全解决了这个问题!嗯...大部分解决了,我可以将几个“条目”分配给交叉切割吗,例如[entry[0, 1, 2] for entry in L]? - ImmortalxR
感谢您的编辑,很抱歉我没有表述得更清楚,但我正在尝试访问更接近这个的内容:[entry[0, 8, 13] for entry in L],这意味着切片不会从1-3,而实际上需要是单独的索引。非常感谢您所提供和已经提供的任何帮助。 - ImmortalxR

2

使用内部列表的两种方式:

for index, sublist in enumerate(L):
    # do something with sublist
    pass

或者使用迭代器。
iterator = iter(L)
sublist = L.next() # <-- yields the first sublist

在这两种情况下,可以通过以下方式访问sublist元素:
  • 直接索引

sublist[2]
  • 迭代

iterator = iter(sublist)
iterator.next()  # <-- yields first elem of sublist

for elem in sublist:
    # do something with my elem
    pass

2
你手上拥有的是一组元组列表,可以像列表一样访问它们。
L[3][2]

从列表L中的第三个元组中获取第二个元素


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接