如何从列表中删除连续的重复项?
如何在python中从这样的列表中删除连续的重复项?如何从列表中删除连续的重复项?
lst = [1,2,2,4,4,4,4,1,3,3,3,5,5,5,5,5]
拥有一个唯一的列表或集合不会解决问题,因为在前面的列表中有一些重复的值,如1,...,1。
我想要的结果是这样的:
newlst = [1,2,4,1,3,5]
你也请考虑当我有这样 [4, 4, 4, 4, 2, 2, 3, 3, 3, 3, 3, 3]
列表和我想要的结果是[4,2,3,3]
而非[4,2,3]
。
itertools.groupby()是您的解决方案。
newlst = [k for k, g in itertools.groupby(lst)]
如果希望组和限制由该项的值的组的大小,这意味着8 4的将是[4,4],和9 3的将是[3,3,3]这里是2个选项,做它:
import itertools
def special_groupby(iterable):
last_element = 0
count = 0
state = False
def key_func(x):
nonlocal last_element
nonlocal count
nonlocal state
if last_element != x or x >= count:
last_element = x
count = 1
state = not state
else:
count += 1
return state
return [next(g) for k, g in itertools.groupby(iterable, key=key_func)]
special_groupby(lst)
OR
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return itertools.zip_longest(*args, fillvalue=fillvalue)
newlst = list(itertools.chain.from_iterable(next(zip(*grouper(g, k))) for k, g in itertools.groupby(lst)))
您可以选择自己认为合适的。两种方法都适用于数字> 0.
您可能需要这样的东西。
lst = [1, 1, 2, 2, 2, 2, 3, 3, 4, 1, 2]
prev_value = None
for number in lst[:]: # the : means we're slicing it, making a copy in other words
if number == prev_value:
lst.remove(number)
else:
prev_value = number
所以,我们正在经历的列表,如果是一样的前一个数字,我们从列表中删除它,否则,我们更新了以前的号码。
可能有一个更简洁的方式,但这是对我来说最明显的方式。
HTH。
可能更好地构建新列表,因为从for循环中的列表中删除项目可能会导致问题 –
我们这样做。我们正在遍历列表的一个切片副本,而不是原始列表。因此,在我们迭代的时候,不会因为删除而导致自己被删除。 –
我错过了...对不起! –
newlist=[]
prev=lst[0]
newlist.append(prev)
for each in lst[:1]: #to skip 1st lst[0]
if(each!=prev):
newlist.append(each)
prev=each
尽管此代码可能会回答问题,但提供有关此代码为何和/或如何回答此问题的其他上下文可提高其长期价值。不鼓励使用仅有代码的答案。 – Ajean
如果你想使用itertools
方法@MaxU建议,一个可能的代码实现:
import itertools as it
lst=[1,2,2,4,4,4,4,1,3,3,3,5,5,5,5,5]
unique_lst = [i[0] for i in it.groupby(lst)]
print(unique_lst)
st = ['']
[st.append(a) for a in [1,2,2,4,4,4,4,1,3,3,3,5,5,5,5,5] if a != st[-1]]
print(st[1:])
虽然这段代码可能会回答这个问题,但提供关于此代码为什么和/或如何回答问题的其他上下文会提高其长期价值。不鼓励使用仅有代码的答案。 – Ajean
检查下一个元素总是不等于项目。如果这样追加。
lst = [1,2,2,4,4,4,4,1,3,3,3,5,5,5,5,5]
new_item = lst[0]
new_list = [lst[0]]
for l in lst:
if new_item != l:
new_list.append(l)
new_item = l
print new_list
print lst
list1 = ['a', 'a', 'a', 'b', 'b' , 'a', 'f', 'c', 'a','a']
temp_list = []
for item in list1:
if len(temp_list) == 0:
temp_list.append(item)
elif len(temp_list) > 0:
if temp_list[-1] != item:
temp_list.append(item)
print(temp_list)
- 从主列表(列表1)获取的每个项目。
- 如果'temp_list'为空,请添加该项目。
- 如果不是,请检查temp_list中的最后一项是否为 ,与我们从“list1”中取出的项目是否相同。
- 如果项目不同,则追加到temp_list中。
你是什么意思的崩溃? – neverendingqs
看看'itertools.groupby' – MaxU
你在问一个工具或实现吗?如果你想自己编写它,你可以遍历并保留任何不匹配元素的元素。 –