繁体   English   中英

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

[英]Python: Keep first occurrence of an item in a list

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

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

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

preserve_first(letters, 'c')

并返回:

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

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

您只想删除重复的'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']

一般的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)

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

您可以使用生成器尝试:

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']

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

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:])

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

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']

迟到了,但是

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")

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

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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM