迭代嵌套列表

时间:2018-05-02 19:26:41

标签: python list

我正在处理科学数据并使用一个名为pysam的模块,以便为我文件中的每个唯一“对象”获取参考位置。

最后,我获得了一个看起来像这样的“列表列表”(这里我提供了一个文件中只有两个对象的例子):

pos = [[1,2,3,6,7,8,15,16,17,20],[1,5,6,7,8,20]]

并且,对于pos中的每个列表,我想迭代这些值并将value[i]value[i+1]进行比较。如果差异大于2(例如),我想将两个值(value[i]value[i+1])存储到新列表中。

如果我们称之为final_pos,那么我想获得:

final_pos = [[3,6,8,15,17,20],[1,5,8,20]]

起初看起来相当容易,但我必须缺乏关于列表如何工作的一些基本知识,我无法设法迭代每个列表的每个值,然后将连续值进行比较。 如果有人有想法,我非常愿意听到它!

提前感谢您的时间!

编辑:这是我试过的:

pos = [[1,2,3,6,7,8,15,16,17,20],[1,5,6,7,8,20]]    

final_pos = []

for list in pos:
        for value in list:
            for i in range(len(list)-1):
                if value[i+1]-value[i] > 2:
                    final_pos.append(value[i])
                    final_pos.append(value[i+1])

2 个答案:

答案 0 :(得分:3)

您可以迭代pos中的每个单独列表,然后比较连续值。当您需要插入值时,可以使用临时集,因为您不希望在最终列表中两次插入相同的元素。然后,您可以将临时集转换为列表并将其附加到最终列表(在对其进行排序后,以保留顺序)。此外,排序仅在原始列表中的元素实际排序时才有效。

pos = [[1,2,3,6,7,8,15,16,17,20],[1,5,6,7,8,20]]
final_pos = []

for l in pos:
    temp_set = set()
    for i in range(len(l)-1):
        if l[i+1] - l[i] > 2:
            temp_set.add(l[i])
            temp_set.add(l[i+1])

    final_pos.append(sorted(list(temp_set)))

print(final_pos)

输出

[[3, 6, 8, 15, 17, 20], [1, 5, 8, 20]]

修改:关于您尝试的内容:

for list in pos:

这一行将给我们list = [1,2,3,6,7,8,15,16,17,20](在第一次迭代中)

for value in list:

这一行将给我们value = 1(在第一次迭代中)

现在,value只是一个不是列表的数字,因此value[i]value[i+1]没有意义。

答案 1 :(得分:3)

您的代码有明显的“太多循环”问题。它还将结果存储为平面列表,您需要一个列表列表。

它还有一个更微妙的错误:如果连续两个时间间隔匹配,则可以多次添加相同的索引。我已经在set中注册了添加的索引以避免这种情况。

这个错误没有显示原始数据(这让很多有经验的用户绊倒了,包括我),所以我改变了它:

pos = [[1,2,3,6,7,8,11,15,16,17,20],[1,5,6,7,8,20]]

final_pos = []

for value in pos:
    sublist = []
    added_indexes = set()
    for i in range(len(value)-1):
        if value[i+1]-value[i] > 2:
            if not i in added_indexes:
                sublist.append(value[i])
                ## added_indexes.add(i)  # we don't need to add it, we won't go back
            # no need to test for i+1, it's new
            sublist.append(value[i+1])
            # registering it for later
            added_indexes.add(i+1)
    final_pos.append(sublist)

print(final_pos)

结果:

[[3, 6, 8, 11, 15, 17, 20], [1, 5, 8, 20]]

将索引存储在set中,而不是值(在这里也可以使用某些后处理排序,请参阅this answer)也可以在对象不是时存储hashable (比如在它们之间实现自定义距离的自定义对象)或只有部分排序(wave)才有兴趣(例如:pos = [[1,2,3,6,15,16,17,20,1,6,10,11],[1,5,6,7,8,20,1,5,6,7,8,20]]