如何根据列表值的重复性拆分列表列表?

时间:2016-05-25 16:26:51

标签: python list

假设我有一个代表坐标的格式列表:

[['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]

3 个答案:

答案 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)那么那将是循环的结束,因为在此部分列表之后将不会留下任何元素。

此外,循环继续切片列表,直到出现上述两种情况之一