![](/img/trans.png)
[英]Python to search a string for the first occurrence of any item in a list
[英]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.