Манипуляция списками дубликатов - PullRequest
0 голосов
/ 23 февраля 2019

Итак, у меня есть элементы в списке, которыми я бы хотел манипулировать, в основном я хочу, чтобы это произошло:

input:
my_list = ['Gold Trophy (January)', 'Gold Trophy (February)', 'Bronze Trophy 
(March)']

output:
['Gold Trophy x2', 'Bronze Trophy (March)']

Когда есть повторяющаяся общая строка (например, в случае Gold Trophy)Я хочу удалить оба этих элемента и сформировать новый элемент с надписью (Золотой трофей x (количество дубликатов))

Вот что у меня есть:

my_list = ['Gold Trophy (January)', 'Gold Trophy (February)', 'Bronze Trophy 
(March)']

# function to count how many duplicates
def countX(my_list, myString): 
    count = 0
    for ele in my_list: 
        if (myString in ele): 
            count = count + 1
    return count 

myString = 'Gold Trophy'
real_count = (countX(my_list, myString))


print(*my_list, sep=', ')
print('duplicates = '+str(countX(my_list, myString)))

На этомТочка, этот код выполняется и возвращает, сколько дубликатов указанной строки в списке.Любые идеи о том, где отсюда, чтобы достичь желаемого результата?Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Это должно работать без использования регулярных выражений.Я поместил комментарии для ясности о том, что происходит.

from collections import Counter
my_list = ['Gold Trophy (January)', 'Gold Trophy (February)', 'Bronze Trophy (March)']
output_ls = []
trophy_ls = []
month_ls = []
trophy_cnt_dc = {}
for item in my_list:
    trophy_ls.append(item.split(' (')[0])
    month_ls.append(item.split(' (')[1])
# print(trophy_ls) >> ['Gold Trophy', 'Gold Trophy', 'Bronze Trophy']
# print(month_ls) >> ['January)', 'February)', 'March)']
trophy_cnt_dc = dict(Counter(trophy_ls))
#print(trophy_cnt_dc) >> {'Gold Trophy': 2, 'Bronze Trophy': 1}
for k,v in trophy_cnt_dc.items():
    if v > 1:
        output_ls.append(k+' x'+str(v))
    else:
        ind = trophy_ls.index(k)
        output_ls.append(k+' ('+month_ls[ind])
print(output_ls)

Выход:

['Gold Trophy x2', 'Bronze Trophy (March)']
0 голосов
/ 23 февраля 2019

Это решение (см. Комментарии для уточнения).Обратите внимание, что я использовал небольшой хак для разделения имен и дат: я разделил на ( и затем восстановил его, если необходимо.Можно сделать это чище, но неясно, требуется ли это.

my_list = ['Gold Trophy (January)', 'Gold Trophy (February)', 'Bronze Trophy (March)']

# Create map of tuples: (name, date)
pairs = [tuple(x.split('(')) for x in my_list]

# count the number of each name
counts = dict()
for (name, day) in pairs:
    counts[name] = counts.get(name, 0) + 1

# create a dictionary from initial list
# it doesn't matter how collisions are resolved
# the dictionary is required to process each name only once
init = dict(pairs)
res = []

# for each name:
#   if count is > 1, print the count
#   if count is 1, then print its date
for (name, date) in init.items():
    if counts[name] > 1:
        res.append(name + 'x' + str(counts[name]))
    else:
        res.append(name + '(' + date)
print(res)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...