Уникальные элементы подсписков в зависимости от заданного значения c в подсписке - PullRequest
2 голосов
/ 12 февраля 2020

Я пытаюсь выбрать уникальные наборы данных из очень большого, довольно противоречивого списка. Мой набор данных RawData состоит из строковых элементов различной длины. Некоторые элементы встречаются много раз, например: ['a','b','x','15/30'] Клавиша для сравнения Элементом всегда является последняя строка : например, '15 / 30 '

Цель: Получить список: UniqueData с элементами, которые встречаются только один раз. (Я хочу сохранить заказ)

Набор данных:

RawData = [['a','b','x','15/30'],['d','e','f','g','h','20/30'],['w','x','y','z','10/10'],['a','x','c','15/30'],['i','j','k','l','m','n','o','p','20/60'],['x','b','c','15/30']]

Мое желаемое решение Набор данных:

UniqueData = [['a','b','x','15/30'],['d','e','f','g','h','20/30'],['w','x','y','z','10/10'],['i','j','k','l','m','n','o','p','20/60']]

Я перепробовал множество возможных решений, например:

for index, elem in enumerate(RawData): и добавление в новый список, если .....

for element in list не работает, потому что элементы не совсем то же самое.

Можете ли вы помочь мне найти решение моей проблемы?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 12 февраля 2020

Лучший способ удалить дубликаты - добавить их в набор. Добавьте последний элемент в set, чтобы отслеживать все уникальные значения. Когда значение, которое вы хотите добавить, уже присутствует в наборе unique, ничего не делайте, если его нет, добавьте значение для набора unique и добавьте lst к списку результатов здесь: new.

Попробуйте это .

new=[]
unique=set()
for lst in RawData:
     if lst[-1] not in unique:
         unique.add(lst[-1])
         new.append(lst)

print(new)
#[['a', 'b', 'x', '15/30'],
 ['d', 'e', 'f', 'g', 'h', '20/30'],
 ['w', 'x', 'y', 'z', '10/10'],
 ['i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', '20/60']]
1 голос
/ 12 февраля 2020

Вы можете настроить новый массив для уникальных данных и отслеживать элементы, которые вы видели до сих пор. Затем, когда вы просмотрите данные, если вы еще не видели последний элемент в этом списке, добавьте их к уникальным данным и добавьте в список просмотра.

RawData = [['a', 'b', 'x', '15/30'], ['d', 'e', 'f', 'g', 'h', '20/30'], ['w', 'x', 'y', 'z', '10/10'],
           ['a', 'x', 'c', '15/30'], ['i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', '20/60'], ['x', 'b', 'c', '15/30']]
seen = []
UniqueData = []
for data in RawData:
    if data[-1] not in seen:
        UniqueData.append(data)
        seen.append(data[-1])

print(UniqueData)

ВЫХОД

[['a', 'b', 'x', '15/30'], ['d', 'e', 'f', 'g', 'h', '20/30'], ['w', 'x', 'y', 'z', '10/10'], ['i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', '20/60']]
0 голосов
/ 12 февраля 2020

Использование набора для фильтрации записей, для которых ключ уже был просмотрен, является наиболее эффективным способом go.

Вот один пример с использованием понимания списка с внутренними побочными эффектами:

UniqueData = [rd for seen in [set()] for rd in RawData if not(rd[-1] in seen or seen.add(rd[-1])) ]
0 голосов
/ 12 февраля 2020
    RawData = [['a','b','x','15/30'],['d','e','f','g','h','20/30'],['w','x','y','z','10/10'],['a','x','c','15/30'],['i','j','k','l','m','n','o','p','20/60'],['x','b','c','15/30']]

seen = []
seen_indices = []

for _,i in enumerate(RawData):
  # _ -> index
  # i -> individual lists
  if i[-1] not in seen:
   seen.append(i[-1])
  else:
   seen_indices.append(_)

for index in sorted(seen_indices, reverse=True):
    del RawData[index]

print (RawData)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...