让对象包含颜色和大小,以及类似
的列表 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>]
列表理解或直接在列表上迭代将无效,因为我无法访问上一个元素......
我知道我可以创建第二个列表,只有在它是“新”颜色时才添加它,但我想在可能的情况下就地进行。
答案 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]]