Python:首先在列表中出现一个项目

时间:2017-08-15 20:34:46

标签: python python-2.7 pandas

除了第一次出现之外,如何删除列表中特定值的所有出现次数?
例如。我有一个清单:

letters = ['a', 'b', 'c', 'c', 'c', 'd', 'c', 'a', 'a', 'c']

我需要一个看起来像这样的函数:

preserve_first(letters, 'c')

并返回:

['a', 'b', 'c', 'd', 'a', 'a']

删除除第一次出现的给定值之外的所有值,否则保留顺序。如果有办法用pandas.Series来做更好的事情。

7 个答案:

答案 0 :(得分:7)

您只想删除'c'的重复项。因此,您希望过滤所有系列不重复的位置,它不等于'c'。我喜欢用pd.Series.ne代替pd.Series !=,因为包裹括号的减少增加了可读性(我的意见)。

s = pd.Series(letters)

s[s.ne('c') | ~s.duplicated()]

0    a
1    b
2    c
5    d
7    a
8    a
dtype: object

完全按照要求行事。

def preserve_first(letters, letter):
    s = pd.Series(letters)
    return s[s.ne(letter) | ~s.duplicated()].tolist()

preserve_first(letters, 'c')

['a', 'b', 'c', 'd', 'a', 'a']

答案 1 :(得分:3)

一般的Python解决方案:

def keep_first(iterable, value):
    it = iter(iterable)
    for val in it:
        yield val
        if val == value:
            yield from (el for el in it if el != value)

这会产生所有项目,包括第一个值(如果找到),然后产生剩余的可迭代过滤掉与该值匹配的项目。

答案 2 :(得分:2)

您可以使用生成器尝试此操作:

def conserve_first(l, s):
     last_seen = False
     for i in l:
         if i == s and not last_seen:
               last_seen = True
               yield i

         elif i != s:
               yield i

letters = ['a', 'b', 'c', 'c', 'c', 'd', 'c', 'a', 'a', 'c']
print(list(conserve_first(letters, "c")))

输出:

['a', 'b', 'c', 'd', 'a', 'a']

答案 3 :(得分:1)

您可以使用列表过滤器和切片:

def preserve_first(letters, elem):
    if elem in letters:
        index = letters.index(elem)
        return letters[:index + 1] + filter(lambda a: a != 'c', letters[index + 1:])

答案 4 :(得分:0)

不使用pandas,但这是一个简单的算法来完成这项工作。

def preserve_firsts(letters, target):
    firsts = []
    seen = False
    for letter in letters:
        if letter == target:
            if not seen:
                firsts.append(letter)
                seen = True
        else:
            firsts.append(letter)
    return firsts

> letters = ['a', 'b', 'c', 'c', 'c', 'd', 'c', 'a', 'a']
> preserve_firsts(letters, 'c')
['a', 'b', 'c', 'd', 'a', 'a']

答案 5 :(得分:0)

晚会,但

letters = ['a', 'b', 'c', 'c', 'c', 'd', 'c', 'a', 'a', 'c']

def preserve_first(data, letter):
    new = []
    count = 0
    for i in data:
        if i not in new:
            if i == letter and count == 0:
                new.append(i)
                count+=1
            elif i == letter and count == 1:
                continue
            else:
                new.append(i)
        else:
            if i == letter and count == 1:
                continue
            else:
                new.append(i)  

l = preserve_first(letters, "c")

答案 6 :(得分:0)

我能想到的最简单的解决方案。

letters = ['a', 'b', 'c', 'c', 'c', 'd', 'c', 'a', 'a', 'c']
key = 'c'

def preserve_first(letters, key):
    first_occurrence = letters.index(key)
    return [item for i, item in enumerate(letters) if i == first_occurrence or item != key]