список сохраняйте это значение самым высоким среди 2

#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]]