假设我有一个代表坐标的格式列表:
[['1', '1'],
['2', '2'],
['3', '3'],
['1', '1'],
['5', '5'],
['6', '6'],
['7', '7'],
['5', '5'],
['8', '8'],
['9', '9'],
['10', '10'],
['8', '8']]
我想将此列表列表拆分为3个列表列表,以便第一个列表以列表[1, 1]
开头,以列表[1, 1]
结束,第二个列表以列表{{1}开头并以列表[5, 5]
等结束
所以基本上,我想在每次遇到与列表初始值相同的值时创建一个新列表。
关于如何实现此类操作的任何想法?
编辑。我尝试了一些尝试,但没有得到预期的结果:
[5, 5]
#
poly_pts = []
for pt in tlist:
x = 0
init_pt = tlist[0]
if pt != init_pt:
poly_pts.append(pt)
x += 1
elif pt == init_pt:
poly_pts.append(pt)
init_pt = tlist[x+1]
答案 0 :(得分:1)
试试这个:
t = [['1', '1'],
['2', '2'],
['3', '3'],
['1', '1'],
['5', '5'],
['6', '6'],
['7', '7'],
['5', '5'],
['8', '8'],
['9', '9'],
['10', '10'],
['8', '8']]
ix = 0
tmp = []
while ix < len(t):
tmp.append(t[ix:t.index(t[ix], ix+1)+1])
ix = t.index(t[ix], ix+1) + 1
>>> tmp
[[['1', '1'], ['2', '2'], ['3', '3'], ['1', '1']], [['5', '5'], ['6', '6'], ['7', '7'], ['5', '5']], [['8', '8'], ['9', '9'], ['10', '10'], ['8', '8']]]
我没有检查任何错误,由您来实现。我使用[].index
来表示列表中元素的索引,此函数还可以使用第二个参数来指定要从哪个索引搜索元素。
答案 1 :(得分:1)
你可以这样做:
first = []
all_lists = []
j = 0
for i, item in enumerate(a):
if first == []:
first = a[i]
print(first)
elif first == a[i]:
all_lists.append(a[j:i+1])
j = i + 1
first = []
print(all_lists)
它类似于你的第一次尝试,但我使用enumerate()给我一个索引和项目的元组。诀窍是在找到匹配后首先重新置位(如代码中的init_pt)为空。
答案 2 :(得分:0)
list.index()
给出元素首先出现在列表中的元素的索引
temp =[]
while True:
try:
idx = list[1:].index(list[0])
except ValueError:
temp.append(list)
break
if idx == len(list)-2:
temp.append(list)
break
temp.append(list[:idx+2])
list = list[idx+2:]
上面代码中发生的事情是
在try
内,我们试图在列表的其余部分中获取列表的第一个元素的索引,除了第一个元素。如果列表的其余部分中没有元素,则会引发ValueError
并结束循环
如果我们得到元素的索引,那么例如如果列表中有5个元素,如list=[1,2,3,4,1]
idx = 3
所以,如果idx+2 = len(list)
那么那将是循环的结束,因为在此部分列表之后将不会留下任何元素。
此外,循环继续切片列表,直到出现上述两种情况之一