这是我的代码:
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]”中删除第二个副本,而是应删除第一个副本。
答案 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']
>>>