如何按特定顺序从列表中获取唯一值?

3

我有一个包含重复值的列表,如下所示:

L1 = ['r-A','r-G','S1','r-A','S2','r-O','r-G','S2','S1','r-A']

我希望您能够将其中包含'r-'的重复元素移除,仅保留相应位置上的第一个值。

即:

For 'r-A' select L1[0] and in output would be L2[0]
For 'r-G' select L1[1] and in output would be L2[1]
For 'r-O' select L1[5] and in output would be L2[4]

因此,输出列表将为:
L2 = ['r-A','r-G','S1','S2','r-O','S2','S1']

使用set()可以获取唯一的值,但是它们的顺序可能不同,并且会删除不包含r-的值。
>>> list(set(L1))
['S2', 'S1', 'r-A', 'r-G', 'r-O']

我该怎么做?

5个回答

1
final = []
[final.append(x) for x in L1 if not x in final or not "r-" in x]

1
你可以使用简单的 for 循环来实现,首先检查字符串是否以 r- 开头,然后再检查它是否已经在输出列表中,如果没有则将其添加进去。
L1 = ['r-A','r-G','S1','r-A','S2','r-O','r-G','S2','S1','r-A']
result = list()

for i in L1:
    if i.startswith('r-'):
        if i not in result:
            result.append(i)
    else:
      result.append(i)

print(result) # ['r-A', 'r-G', 'S1', 'S2', 'r-O', 'S2', 'S1']

谢谢回答。我尝试了你的代码,但是我得到了不同的顺序 ['r-A', 'r-G', 'r-O', 'S1', 'S2', 'S2', 'S1'] - Ger Cas
1
我得到了这个输出 ['r-A', 'r-G', 'S1', 'S2', 'r-O', 'S2', 'S1'] @GerCas - Ryuzaki L

1
这应该可以做到:

L1 = ['r-A','r-G','S1','r-A','S2','r-O','r-G','S2','S1','r-A']
L2 = []
for item in L1:
    if 'r-' in item and item  in L2:
         continue
    else:
        L2.append(item)
print(L2)

输出:

['r-A', 'r-G', 'S1', 'S2', 'r-O', 'S2', 'S1']

1
这也应该可以工作:

 L1 = ['r-A','r-G','S1','r-A','S2','r-O','r-G','S2','S1','r-A']

 newL1 = []
 for element in L1:
    if element == "S1":
      newL1.append(element)
    elif element == "S2":
      newL1.append(element)
    else:
      if element not in newL1:
        newL1.append(element)
 print(newL1)

输出:

>>>['r-A', 'r-G', 'S1', 'S2', 'r-O', 'S2', 'S1']

1

时间复杂度为O(n)的简短代码。

>>> d = dict.fromkeys(L1, 1)
>>> [x for x in L1 if x[:2] != 'r-' or d.pop(x, 0)]
['r-A', 'r-G', 'S1', 'S2', 'r-O', 'S2', 'S1']

我正在追踪可以使用而尚未使用的r-元素。这有点容易,因为dict.pop可以在表达式中使用,同时删除并返回一个值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接