#python
#питон
Вопрос:
Здравствуйте, у меня есть список, который содержит имя, имя и результат. Я хотел бы создать новый список без дубликатов.В этом случае » М » существует дважды, поэтому я хочу сохранить только его лучший результат.
Я написал этот код, но он хранит у меня дубликаты.
Я хочу, чтобы это было в выводе :
[['L', 'l', '7.69'], ['M', 'm', '9.10'], ['N', 'n', '7.69'], ['O', 'o', '5.90']]
Вы не могли бы мне помочь? Спасибо.
list_no_ok = [['L', 'l', '7.69'], ['M', 'm', '4.10'], ['M', 'm', '9.10'], ['N', 'n', '7.69'], ['O', 'o', '5.90']] list_ok = [] for i, next_i in zip(list_no_ok, list_no_ok[1::]): if i[0] == next_i[0] and i[1] == next_i[1]: if i[6] gt; next_i[6]: lala = [i[0], i[1], i[2], i[6]] else: lala = [next_i[0], next_i[1], next_i[2], next_i[6]] else: lala = [i[0], i[1], i[2], i[6]] list_ok.append(lala) print(list_ok)
Комментарии:
1. Что у
desired output
тебя такое ?2. Похоже , он хочет создать список уникальных предметов на основе
but it doesn't work! because it keeps duplicates.
, но, как сказал @EL-AJIOussama, показав вашиdesired output
данные, вам будет легче помочь.3. Я хочу создать новый список без дубликатов. В этом случае » М » существует дважды, поэтому я хочу сохранить только его лучший результат.
4. @bendour Пожалуйста, отредактируйте свой вопрос, чтобы показать фактические выходные данные, которые вы хотите получить в этом примере.
5. Я отредактировал вопрос.@ alani
Ответ №1:
Предполагая, что все элементы «закончены», вот код
def deDupe(): list_ok = [['L', 'l', 'Finished', '7.69'], ['M', 'm', 'Finished', '9.10'], ['M', 'm', 'Finished', '9.10'], ['N', 'n', 'Finished', '7.69'], ['O', 'o', 'Finished', '5.90']] capture_dict = {} for element in list_ok: keyValue = '{0}{1}'.format(element[0], element[1]) if keyValue in list(capture_dict.keys()): compare_value = capture_dict[keyValue] if float(element[3]) gt; float(compare_value[3]): capture_dict.pop(keyValue) capture_dict[keyValue] = element else: capture_dict[keyValue] = element list_2 = list(capture_dict.values()) print(list_2)
Выход:
gt;gt;gt; deDupe() [['L', 'l', 'Finished', '7.69'], ['M', 'm', 'Finished', '9.10'], ['N', 'n', 'Finished', '7.69'], ['O', 'o', 'Finished', '5.90']]
Ответ №2:
Следует очень наивный, совсем не умный подход с использованием хэша. Повторите этот список. Для каждого списка в списке первым элементом является ключ. Сравните с третьим значением в списке, уже связанным с этим ключом. Конечно, если мы еще не смотрели на этот ключ, будет сделано исключение. Мы можем справиться с этим, добавив текущий список в хэш с текущим ключом.
Мы можем получить список, который хотим, используя values
и преобразуя его в a list
.
gt;gt;gt; a = [['L', 'l', '7.69'], ['M', 'm', '4.10'], ['M', 'm', '9.10'], ['N', 'n', '7.69'], ['O', 'o', '5.90']] gt;gt;gt; h = {} gt;gt;gt; for x in a: ... key = x[0] ... try: ... if h[key][2] lt; x[2]: ... h[key] = x ... except KeyError: ... h[key] = x ... gt;gt;gt; h {'L': ['L', 'l', '7.69'], 'M': ['M', 'm', '9.10'], 'N': ['N', 'n', '7.69'], 'O': ['O', 'o', '5.90']} gt;gt;gt; list(h.values()) [['L', 'l', '7.69'], ['M', 'm', '9.10'], ['N', 'n', '7.69'], ['O', 'o', '5.90']]
Комментарии:
1. Я предлагаю вам поймать конкретное исключение (
KeyError
), а не голоеexcept:
Ответ №3:
Я предлагаю вам использовать словарь, чтобы отслеживать, какая строка имеет лучший результат для каждого человека, а затем пролистывать строки, обновляя словарь, если для этого человека уже не было замечено лучшего результата.
Ключом для словаря является двухэлементный кортеж имени и имени.
Наконец, выведите значения, содержащиеся в словаре.
list_ok = [['L', 'l', '7.69'], ['M', 'm', '9.10'], ['M', 'm', '9.10'], ['N', 'n', '7.69'], ['O', 'o', '5.90']] bests = {} def score_from_row(row): return float(row[2]) for row in list_ok: key = (row[0], row[1]) score = score_from_row(row) if key in bests: previous_best = bests[key] if score_from_row(previous_best) gt; score: continue bests[key] = row print(list(bests.values()))
Это дает:
[['L', 'l', '7.69'], ['M', 'm', '9.10'], ['N', 'n', '7.69'], ['O', 'o', '5.90']]
Ответ №4:
Это подход, который анализирует ваш список и сохраняет значения по мере их поступления, dictionary
а также проверяет текущий результат на соответствие наивысшему показанному на сегодняшний день результату.
Почему Питон dictionary
? Потому что словари:
- храните пары ключей и значений (что идеально, так как вы хотите сопоставить имя и результат).
- сделайте дедупликацию значений довольно простой, что является одной из целей (т. е. Сохраните только один результат для
'M', 'm'
)
Давайте посмотрим на код:
list_no_ok = [['L', 'l', '7.69'], ['M', 'm', '4.10'], ['M', 'm', '9.10'], ['N', 'n', '7.69'], ['O', 'o', '5.90']] highest_values = {} for name, first_name, result in list_no_ok: # To properly check the result values, convert to a float. result = float(result) # This step looks in the dictionary to see if a key that matches # the name, first_name tuple exists and if yes, will get the # stored result so we can check to see if the next result is # higher. IF that tuple doesn't exist, it will return a default # value of 0 (you can set that default to be number you want). current_value = highest_values.get((name, first_name), 0) # Here we check for the highest value and if the current result # is higher than the stored value, then we replace it with the # new higher value # If we have never seen the name before, the current value will be 0 # and the new result will be higher than that, so the # new result will replace the 0. Similarly if we we saw # a lower value before, the new result will overwrite any previous lower values. if result gt; current_value: highest_values[(name, first_name)] = result
Наконец, как только мы пройдемся по всем значениям, мы сможем безопасно сгенерировать окончательный список для печати:
list_ok = [] for names, result in highest_values.items(): # names will be the tuple we used as a key in the # dictionary, so it will need to be "unpacked" into # the separate values of name and first_name name, first_name = names list_ok.append([name, first_name, result]) print(list_ok) [['L', 'l', 7.69], ['M', 'm', 9.1], ['N', 'n', 7.69], ['O', 'o', 5.9]]