除了第一次出现之外,如何删除列表中特定值的所有出现次数?
例如。我有一个清单:
letters = ['a', 'b', 'c', 'c', 'c', 'd', 'c', 'a', 'a', 'c']
我需要一个看起来像这样的函数:
preserve_first(letters, 'c')
并返回:
['a', 'b', 'c', 'd', 'a', 'a']
删除除第一次出现的给定值之外的所有值,否则保留顺序。如果有办法用pandas.Series
来做更好的事情。
答案 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]