根据前一个元素删除列表中的元素并保留顺序

时间:2014-06-03 21:41:41

标签: python list

让对象包含颜色和大小,以及类似

的列表

l = [<'GREEN', 1>, <'BLUE', 1>, <'BLUE', 2>, <'BLUE', 3>, <'RED', 4>, <'RED', 4>, <'GREEN', 5>]

每个元素都是包含颜色和大小(不是元组)的对象的实例。我用非传统方式代表它们。

我只想在前一个元素的颜色相同的情况下从l中消除元素。所以我应该

l = [<'GREEN', 1>, <'BLUE', 1>, <'RED', 4>, <'GREEN', 5>]

列表理解或直接在列表上迭代将无效,因为我无法访问上一个元素......

我知道我可以创建第二个列表,只有在它是“新”颜色时才添加它,但我想在可能的情况下就地进行。

6 个答案:

答案 0 :(得分:1)

FWIW我认为这里的标准方法是使用itertools.groupby

>>> seq = [('GREEN', 1), ('BLUE', 1), ('BLUE', 2), ('BLUE', 3), ('RED', 4), ('RED', 4), ('GREEN', 5)]
>>> from itertools import groupby
>>> [next(g) for k,g in groupby(seq, lambda x: x[0])]
[('GREEN', 1), ('BLUE', 1), ('RED', 4), ('GREEN', 5)]

而不是lambda x: x[0]您可以使用lambda x: x['colour']lambda x: x.colour或任何适当的访问权限。 (另见operator.itemgetter。)

答案 1 :(得分:0)

在前一个元素的上下文中迭代序列的最简洁方法是来自with_prev库的funcy函数:

from funcy import with_prev

[x for x, prev in with_prev(l) 
   if prev and x.color != prev.color]

(我假设您的对象上有color属性。)

答案 2 :(得分:0)

根据您的示例,这应该有效:

def clean(L):
  x = 1
  color = L[0][0]
  while x < len(L):
    if L[x][0]==color: L.pop(x)
    else:
      color=L[x][0]
      x+=1
  return L

答案 3 :(得分:0)

假设l是元组列表,这将起作用:

In [7]: [(c1, n) for (c1, n), (c2, _) in zip(l, [(None, None)] +l) if c1 != c2]
Out[7]: [('GREEN', 1), ('BLUE', 1), ('RED', 4), ('GREEN', 5)]

答案 4 :(得分:-1)

我已经测试并确认以下代码可以正常工作。部分受到其他帖子的启发。

l = ["red","red","green","blue","green","green"]

k = 1
while k < len(l):
  if l[k-1]==l[k]:
    del l[k]
    k = k + 1
  else:
    k = k + 1
for x in range(len(l)):
    print l[x]

输出:

red
green
blue
green

答案 5 :(得分:-1)

受凯尔的启发,这段代码:

l = [['GREEN', 1], ['BLUE', 1], ['BLUE', 2], ['BLUE', 3], ['RED', 4], ['RED', 4], ['GREEN', 5]]

k = 1
while k < len(l):
    if l[k-1][0] == l[k][0]:
        del l[k]
    else:
        k += 1
    print(k,'  ',l)
print('---')
print(l)

给出(2.7&amp; 3.3):

2    [['GREEN', 1], ['BLUE', 1], ['BLUE', 2], ['BLUE', 3], ['RED', 4], ['RED', 4], ['GREEN', 5]]
2    [['GREEN', 1], ['BLUE', 1], ['BLUE', 3], ['RED', 4], ['RED', 4], ['GREEN', 5]]
2    [['GREEN', 1], ['BLUE', 1], ['RED', 4], ['RED', 4], ['GREEN', 5]]
3    [['GREEN', 1], ['BLUE', 1], ['RED', 4], ['RED', 4], ['GREEN', 5]]
3    [['GREEN', 1], ['BLUE', 1], ['RED', 4], ['GREEN', 5]]
4    [['GREEN', 1], ['BLUE', 1], ['RED', 4], ['GREEN', 5]]
---
[['GREEN', 1], ['BLUE', 1], ['RED', 4], ['GREEN', 5]]