Python, удаляй дубликаты и получай максимум по условию - PullRequest
0 голосов
/ 13 октября 2019

Представьте следующее в качестве ввода:

anna-1
anna
anna-0
michael
anna-2

И мой ожидаемый результат:

michael
anna-2

Условие:мы распечатаем строку, если для нее нет дубликатов. Предположим, что дубликаты всегда содержат - в конце, а после этого общее количество дубликатов, которое мы возьмем максимум.

Ответы [ 5 ]

0 голосов
/ 14 октября 2019

Вы можете использовать defaultdict в сочетании с пониманием речи:

from collections import defaultdict

# data in question
data = """
anna-1
anna
anna-0
michael
anna-2"""

# defaultdict
dict_ = defaultdict(int)

dict_ = {name: (number if dict_[name] <= number else dict_[name])
          for line in data.split("\n") if line
          for name, duplicate in [line.split("-") if "-" in line else (line, 0)]
          for number in [int(duplicate)]}

print(dict_)
0 голосов
/ 13 октября 2019

Вот метод, использующий словарь при попытке

from collections import defaultdict

# Assuming you input names into a list
l = ['anna-1', 'anna', 'anna-0', 'michael', 'anna-2']

# Place list into dictionary, with key as names
# and count as value
d = defaultdict(list)
for i in l:
  name_cnt = i.split('-')
  if len(name_cnt) > 1:
    name, cnt = name_cnt
    d[name].append(int(cnt))
  else:
    k = name_cnt[0]  # no count
    d[k].append(-1)  # use default -1

# Show dictionary d
print(d)

# Show Desired Output
for k, cnts in d.items():
  cnt = max(cnts)
  if cnt == -1: # no versions of name
    print(k)
  else:
    print(f'{k}-{cnt}')

Выходы

Словарь d

defaultdict(<class 'list'>, 
    {'anna': [1, -1, 0, 2], 
     'michael': [-1]})

Окончательный результат

anna-2
michael
0 голосов
/ 13 октября 2019

другим подходом может быть

  1. итерация по каждому слову во входных данных
  2. очистить его, удалить -n в конце, вы можете использовать split илиsubstring для него
  3. вставить слово в структуру данных с именем Счетчик
  4. пройти ключи в счетчике
    • , если вхождение ключа равно 1выведите строку
    • , иначе объедините - + количество вхождений до конца ключа и напечатайте ее

* работает только если num of occurrence = max prefix, а не в том случае, если ввод может быть как

anna-1
anna-7001

, в этом случае вы можете использовать обычный dict с некоторой логикой за вставной частью

0 голосов
/ 13 октября 2019
  1. Я предлагаю использовать регулярные выражения , чтобы разбить каждый вход на подстроку name и подстроку number, основываясь на следующем шаблоне, который мы предполагаем, что каждый вход следует:

<name>-<number> или просто <name>.

Посмотрите на пакет re для деталей и точного синтаксиса, но это то, что мой

pattern = "(?P<name>\w+)(?P<number>-\d*)?"

строка делает.

Переход с dict был действительно хорошей идеей, я использую словарь для хранения найденных чисел и постепенно сохраняю только максимальное значение, встречающееся для каждого ввода.

Когда я закончу анализировать каждый ввод, я снова анализирую их все, используя метод словарей .items(), чтобы распечатать нужные данные.

Вот пример кода, который я получилс суммированием:

import re

inputs = ["anna-1", "anna", "anna-0", "michael", "anna-2"]

pattern = "(?P<name>\w+)(?P<number>-\d*)?"

maxNumbers = {} # Remembers the maximum number for each name

# Parse all inputs and split them into name and number
for item in inputs:
    result = re.match(pattern, item)
    # Extract the name
    name = result.group("name")
    # Extract the number (set to zero if there is no number)
    number = result.group("number")
    if number == None:
        number = 0
    else:
        number = int(number[1:])
    # Store the number in the dictionary
    if name not in maxNumbers:
        maxNumbers[name] = number
    else:
        maxNumbers[name] = max(maxNumbers[name], number)

# Parse all names and print their maximum number
for name, maxNumber in maxNumbers.items():
    if maxNumber == 0:
        print(name)
    else:
        print(name + "-" + str(maxNumber))

Обратите внимание, что вы не указали, как программа должна реагировать, если ввод

anna
anna-0

Должен ли он печатать anna-0 или просто anna? Но это вы сможете исправить самостоятельно.

0 голосов
/ 13 октября 2019
  1. Перебрать список и проверить, не появлялась ли строка более одного раза. Если это не так, выведите строку.
  2. Для более чем одного вхождения начните проверку с конца строки на предмет максимального числа. Найдите индекс, имеющий максимальное количество. (Вы можете сделать еще один список, если хотите)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...