Как получить уникальные значения из списка в указанном порядке c? - PullRequest
3 голосов
/ 28 февраля 2020

У меня есть список с повторяющимися значениями, как показано ниже:

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 голос
/ 28 февраля 2020

Короткий со временем 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 может использоваться в выражении, и одновременно удаляет и возвращает значение.

1 голос
/ 28 февраля 2020

Это также должно работать:

 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 голос
/ 28 февраля 2020

Вы можете сделать это просто для l oop, сначала проверьте строку startwith 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']
1 голос
/ 28 февраля 2020

Это должно сделать это:

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 голос
/ 28 февраля 2020
final = []
[final.append(x) for x in L1 if not x in final or not "r-" in x]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...