Python,比较子列表并制作列表
Python, comparison sublists and making a list
我有一个包含很多子列表的列表。即
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 index, value in enumerate(mylist) :
for a in range(len(mylist)-1) :
if mylist[a][0] == 1 :
try :
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)
except IndexError :
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
这些代码看起来一点都不好,结果也没有按照我的预期显示。在底部,我写了 try 和 except 来处理索引错误(列表超出范围),最初我使用 'while' 迭代而不是 'for' 迭代。
我应该怎么做才能得到我想要的结果?我怎样才能更正这些代码,使其看起来更像 'pythonic' 的方式?
任何想法对我来说都很棒,非常感谢。
这似乎对我有用。我不确定它是否以任何方式更符合 Pythonic,而且你会多次循环列表,所以你肯定可以做一些事情来进一步优化它。
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
您将不得不捕获重复的索引,但这应该更有效率:
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
根据您的逻辑,6 和 7 不应该出现,因为它们不符合条件:
[2, 346, 953, 995, 43],
[3, 346, 967, 1084, 118],
另外,根据您的描述,10 应该是 <= 2
而不是 < 2
。
您可以使用 OrderedDict 删除重复项并保持顺序:
from collections import OrderedDict
print(OrderedDict.fromkeys(gr).keys())
[0, 1, 3, 4, 10, 11, 12]
我有一个包含很多子列表的列表。即
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 index, value in enumerate(mylist) :
for a in range(len(mylist)-1) :
if mylist[a][0] == 1 :
try :
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)
except IndexError :
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
这些代码看起来一点都不好,结果也没有按照我的预期显示。在底部,我写了 try 和 except 来处理索引错误(列表超出范围),最初我使用 'while' 迭代而不是 'for' 迭代。
我应该怎么做才能得到我想要的结果?我怎样才能更正这些代码,使其看起来更像 'pythonic' 的方式? 任何想法对我来说都很棒,非常感谢。
这似乎对我有用。我不确定它是否以任何方式更符合 Pythonic,而且你会多次循环列表,所以你肯定可以做一些事情来进一步优化它。
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
您将不得不捕获重复的索引,但这应该更有效率:
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
根据您的逻辑,6 和 7 不应该出现,因为它们不符合条件:
[2, 346, 953, 995, 43],
[3, 346, 967, 1084, 118],
另外,根据您的描述,10 应该是 <= 2
而不是 < 2
。
您可以使用 OrderedDict 删除重复项并保持顺序:
from collections import OrderedDict
print(OrderedDict.fromkeys(gr).keys())
[0, 1, 3, 4, 10, 11, 12]