我正在处理科学数据并使用一个名为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])
答案 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]]
)