如何删除列表中第一个出现的整数

时间:2016-09-03 16:49:57

标签: python python-3.x

这是我的代码:

positions = []
for i in lines[2]:
    if i not in positions:
        positions.append(i)
print (positions)
print (lines[1])
print (lines[2])

输出是:

['1', '2', '3', '4', '5']
['is', 'the', 'time', 'this', 'ends']
['1', '2', '3', '4', '1', '5']

我希望变量“position”的输出为; [ '2', '3', '4', '1', '5'] 所以不是从变量“lines [2]”中删除第二个副本,而是应删除第一个副本。

3 个答案:

答案 0 :(得分:4)

您可以撤消列表,创建位置,然后按照评论中@tobias_k的提及将其撤回:

lst = ['1', '2', '3', '4', '1', '5']

positions = []
for i in reversed(lst):
    if i not in positions:
        positions.append(i)

list(reversed(positions))
# ['2', '3', '4', '1', '5']

答案 1 :(得分:3)

在构建positions之前,您需要首先检测重复的值。使用itertools.Counter()对象来测试是否多次看到某个值:

from itertools import Counter

counts = Counter(lines[2])
positions = []
for i in lines[2]:
    counts[i] -= 1
    if counts[i] == 0:
        # only add if this is the 'last' value
        positions.append(i)

这适用于任意数量的重复值;只使用最后出现的值。

您也可以撤消列表,并使用集合跟踪您已经看到的内容,这比针对列表进行测试更快:

positions = []
seen = set()
for i in reversed(lines[2]):
    if i not in seen:
        # only add if this is the first time we see the value
        positions.append(i)
        seen.add(i)
positions = positions[::-1]  # reverse the output list

这两种方法都需要两次迭代;第一个创建counts映射,第二个反转输出列表。哪个更快将取决于lines[2]的大小及其中的重复数量,无论您是否使用Python 3(其中Counter性能得到显着改善)。

答案 2 :(得分:0)

您可以使用字典保存元素的最后位置,然后使用该信息构建新列表

>>> data=['1', '2', '3', '4', '1', '5']
>>> temp={ e:i for i,e in enumerate(data) }
>>> sorted(temp, key=lambda x:temp[x])
['2', '3', '4', '1', '5']
>>>