从列表中返回半唯一值

时间:2017-01-06 01:40:01

标签: python ipython python-3.5

不知道怎么说这个,但是说​​我有一个包含以下序列的列表:

[a,a,a,b,b,b,a,a,a]

我想回来:

[a,b,a]

原则上如何做到这一点?

4 个答案:

答案 0 :(得分:4)

您可以使用itertools.groupby,它将同一组中的连续相同元素分组,并返回键值对的迭代器,其中键是您要查找的唯一元素:

from itertools import groupby  

[k for k, _ in groupby(lst)]
# ['a', 'b', 'a']
lst = ['a','a','a','b','b','b','a','a','a']

答案 1 :(得分:2)

Psidoms的方式要好得多,但我也可以这样写,这样你就可以看到它是如何使用基本循环和语句的。总是很好地弄清楚你需要针对任何问题采取什么步骤,因为它通常会使简单的编码变得更容易:)

original = ['a','a','a','b','b','b','a','a','a']
new = [original[0]]

for letter in original[1:]:
    if letter != new[-1]:
        new.append(letter)

如果前面的字母不同,它基本上会附加一封信。

答案 2 :(得分:1)

使用列表理解:

original = ['a','a','a','b','b','b','a','a','a']
packed = [original[i] for i in range(len(original)) if i == 0 or original[i] != original[i-1]]
print(packed)  # > ['a', 'b', 'a']

同样(感谢pylang)您可以使用enumerate代替range

[ x for i,x in enumerate(original) if i == 0 or x != original[i-1] ]

答案 3 :(得分:0)

more_itertools包含unique_justseen recipe from itertools

的实现
import more_itertools as mit

list(mit.unique_justseen(["a","a","a","b","b","b","a","a","a"]))
# ['a', 'b', 'a']