Python、比较子列表和制作列表

Python、比较子列表和制作列表,python,comparison,append,sublist,Python,Comparison,Append,Sublist,我有一个包含很多子列表的列表。i、 e mylst = [[1, 343, 407, 433, 27], [1, 344, 413, 744, 302], [1, 344, 500, 600, 100], [1, 344, 752, 1114, 363], [1, 345, 755, 922, 168], [2, 345, 188, 1093, 906], [2, 346, 4

我有一个包含很多子列表的列表。i、 e

mylst = [[1, 343, 407, 433, 27], 
         [1, 344, 413, 744, 302], 
         [1, 344, 500, 600, 100], 
         [1, 344, 752, 1114, 363], 
         [1, 345, 755, 922, 168], 
         [2, 345, 188, 1093, 906], 
         [2, 346, 4, 950, 947], 
         [2, 346, 953, 995, 43], 
         [3, 346, 967, 1084, 118], 
         [3, 347, 4, 951, 948], 
         [3, 347, 1053, 1086, 34], 
         [3, 349, 1049, 1125, 77], 
         [3, 349, 1004, 1124, 120], 
         [3, 350, 185, 986, 802], 
         [3, 352, 1018, 1055, 38]]
我想首先对这个列表进行分类,然后使用三个步骤制作另一个列表。首先,当每个子列表中的第一项相同时,我想比较子列表,即mylist[a][0]==1。其次,比较子列表中的第二个项目,如果子列表中的第二个项目与以下第二个项目之间的差异在2下,则计算第三个项目或第四个项目之间的差异。若第三项和第四项的差异小于10,那个么我想附加子列表的索引

我想要的结果应该是。。。像这样:
[0,1,3,4,6,7,10,11,12]

下面是我天真的尝试

def seg(mylist) :
    Segments = []
    for a in range(len(mylist)-1) :
        for index, value in enumerate (mylist) :
            if mylist[a][0] == 1 :
                if abs(mylist[a][1] - mylist[a+1][1]) <= 2 :
                    if (abs(mylist[a][2] - mylist[a+1][2]) <= 10 or 
                        abs(mylist[a][3] - mylist[a+1][3]) <= 10) :
                        Segments.append(index)
return Segments
下面是我天真的尝试

def seg(mylist) :
    Segments = []
    for a in range(len(mylist)-1) :
        for index, value in enumerate (mylist) :
            if mylist[a][0] == 1 :
                if abs(mylist[a][1] - mylist[a+1][1]) <= 2 :
                    if (abs(mylist[a][2] - mylist[a+1][2]) <= 10 or 
                        abs(mylist[a][3] - mylist[a+1][3]) <= 10) :
                        Segments.append(index)
return Segments
def seg(mylist):
段=[]
对于范围内的(len(mylist)-1):
对于索引,枚举中的值(mylist):
如果mylist[a][0]==1:

如果abs(mylist[a][1]-mylist[a+1][1])这似乎对我有效。我不确定它是否在任何方面更像python,你会在列表中循环多次,所以你肯定可以做一些事情来优化它

def seg(mylist):
    # converted list to set in case there are any duplicates
    segments = set()

    for entry_index in range(len(mylist)):
        for c in range(len(mylist)):
            first = mylist[entry_index]
            comparison = mylist[c]

            # ignore comparing the same items
            if entry_index == c:
               continue

            # ignore cases where the first item does not match
            if first[0] != comparison[0]:
                continue

            # ignore cases where the second item differs by more than 2
            if abs(first[1] - comparison[1]) > 2:
                continue

            # add cases where the third and fourth items differ by less than 10
            if abs(first[2] - comparison[2]) < 10 or abs(first[3] - comparison[3]) < 10:
                segments.add(entry_index)

            elif abs(first[2] - comparison[3]) < 10 or abs(first[3] - comparison[2]) < 10:
                segments.add(entry_index)

    return segments
def seg(mylist):
#如果存在任何重复项,则将转换后的列表设置为
段=集()
对于范围(len(mylist))中的条目索引:
对于范围内的c(len(mylist)):
first=mylist[条目索引]
比较=mylist[c]
#忽略比较相同的项目
如果条目_index==c:
持续
#忽略第一项不匹配的情况
如果第一个[0]!=比较[0]:
持续
#忽略第二项差异超过2的情况
如果abs(第一个[1]-比较[1])>2:
持续
#添加第三项和第四项相差小于10的情况
如果abs(第一[2]-比较[2])<10或abs(第一[3]-比较[3])<10:
段。添加(条目索引)
elif abs(第一[2]-比较[3])<10或abs(第一[3]-比较[2])<10:
段。添加(条目索引)
返回段

您必须捕获重复的索引,但这应该更有效:

gr = []
it = iter(mylst)
prev = next(it)

for ind, ele in enumerate(it):
    if ele[0] == prev[0] and abs(ele[1] - prev[1]) <= 2:
        if any(abs(ele[i] - prev[i]) < 10 for i in (2, 3)):
            gr.extend((ind, ind+1))
    prev = ele

同样对于10,它应该是
为什么要保留那些不必要的
行,否则:传递
行?如果没有它们,您的代码将更易于阅读。你应该打断那些长线,用括号来做。它们很容易在
语句中被打断。只是对第二次尝试的一个注释,在
try
中有完全相同的东西,除了
通常是一个问题的标志。忘记了删除其他内容并传递句子,我实际上正在处理它,只是粘贴了这个。谢谢你的评论。@winterfield不客气。我刚刚注意到这两个
return
语句的缩进方式不对。这是一个明显的错误,但你应该修正它。不用担心,就像我说的,一些索引将被添加两次,所以你需要处理它
     [2, 346, 953, 995, 43], 
     [3, 346, 967, 1084, 118], 
from collections import OrderedDict

print(OrderedDict.fromkeys(gr).keys())
[0, 1, 3, 4, 10, 11, 12]