다음과 같은 데이터를 보내는 직렬 포트를 모니터링하고 있습니다.
['','a','a','a','a','a','a','','b','b','b','b','b','b','b','b',
'','','c','c','c','c','c','c','','','','d','d','d','d','d','d','d','d',
'','','e','e','e','e','e','e','','','a','a','a','a','a','a',
'','','','b','b','b','b','b','b','b','b','b','','','c','c','c','c','c','c',
'','','','d','d','d','d','d','d','','','e','e','e','e','e','e',
'','','a','a','a','a','a','a','','b','b','b','b','b','b','b','b',
'','','c','c','c','c','c','c','','','','d','d','d','d','d','d','d','d',
'','','e','e','e','e','e','e','','','a','a','a','a','a','a',
'','','','b','b','b','b','b','b','b','b','b','','','c','c','c','c','c','c',
'','','','d','d','d','d','d','d','','','e','e','e','e','e','e','','']
이것을 다음과 같이 변환 할 수 있어야합니다.
['a','b','c','d','a','b','c','d','a','b','c','d','a','b','c','d']
그래서 중복과 빈 문자열을 제거하고 패턴이 반복되는 횟수도 유지합니다.
나는 그것을 알아낼 수 없었다. 누군가 도울 수 있습니까?
다음은 목록 이해력과 itertools.zip_longest를 사용하는 솔루션입니다 . 빈 문자열이 아닌 경우에만 요소를 유지하고 다음 요소와 동일하지 않습니다. 반복자를 사용하여 목록을 분할하는 비용을 피하기 위해 첫 번째 요소를 건너 뛸 수 있습니다.
from itertools import zip_longest
def remove_consecutive_duplicates(lst):
ahead = iter(lst)
next(ahead)
return [ x for x, y in zip_longest(lst, ahead) if x and x != y ]
용법:
>>> remove_consecutive_duplicates([1, 1, 2, 2, 3, 1, 3, 3, 3, 2])
[1, 2, 3, 1, 3, 2]
>>> remove_consecutive_duplicates(my_list)
['a', 'b', 'c', 'd', 'e', 'a', 'b', 'c', 'd', 'e', 'a', 'b', 'c', 'd',
'e', 'a', 'b', 'c', 'd', 'e']
빈 문자열 (예 :)로 구분 된 중복 항목이 없거나 'a', '', 'a'
그러한 중복 항목을 제거하고 싶지 않다고 가정합니다. 이 가정이 잘못된 경우 먼저 빈 문자열을 필터링해야합니다.
>>> example = ['a', '', 'a']
>>> remove_consecutive_duplicates([ x for x in example if x ])
['a']
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다