https://www.codewars.com/kata/54e6533c92449cc251001667
问题描述
Implement the function unique_in_order which takes as argument a sequence and returns a list of items without any elements with the same value next to each other and preserving the original order of elements.
For example:
unique_in_order('AAAABBBCCDAABBB') == ['A', 'B', 'C', 'D', 'A', 'B']
unique_in_order('ABBCcAD') == ['A', 'B', 'C', 'c', 'A', 'D']
unique_in_order([1,2,2,3,3]) == [1,2,3]
解法
from itertools import groupby
def unique_in_order(iterable):
return [key for key, value in groupby(iterable)]
题目的要求是将连续相同的字符或者数字取唯一,并不是要把字符串中只要出现两次以上的都取唯一。groupby函数的功能正好如何这个要求。
items = [1,2,3,1,2,3]
from itertools import groupby
for key, value in groupby(items):
print(key, list(value), end=' ')
# 1 [1] 2 [2] 3 [3] 1 [1] 2 [2] 3 [3]
for key, value in groupby(sorted(items)):
print(key, list(value), end=' ')
# 1 [1, 1] 2 [2, 2] 3 [3, 3]
groupby函数只会将连续的相同的元素当做同一个分组,这一特点正好与题目要求符合。
def unique_in_order(iterable):
result = []
prev = None
for char in iterable[0:]:
if char != prev:
result.append(char)
prev = char
return result
def unique_in_order(iterable):
res = []
for item in iterable:
if len(res) == 0 or item != res[-1]:
res.append(item)
return res
unique_in_order = lambda l: [z for i, z in enumerate(l) if i == 0 or l[i - 1] != z]
上面两个解法很相似,都是遍历整个list,当前元素和前一个不同则加入结果list中。