Можно ли как-то добавить очки в одной команде в списке? - PullRequest
3 голосов
/ 23 апреля 2019

Как я могу сложить очки для одной команды?

Вот что я пробовал:

def check_league(league_points):
    league_results = []
    for teams in league_points:
    team, points = teams.strip().rsplit(' ', 1)
    print(team, points)

У меня есть список:

['Lions 1', 'Snakes 1', 'Tarantulas 3', 'FC Awesome 0', 'Lions 1', 'FC Awesome 1', 'Tarantulas 3', 'Snakes 0', 'Lions 3', 'Grouches 0']

Выход:

('Lions', '1')

('Snakes', '1')

('Tarantulas', '3')

('FC Awesome', '0')

('Lions', '1')

('FC Awesome', '1')

('Tarantulas', '3')

('Snakes', '0')

('Lions', '3')
('Grouches', '0')

Я хочу вывод:

'Tarantulas', '6'

'Lions', '5'

'FC Awesome', '1'

'Snakes', '1'
'Grouches', '0'

Ответы [ 3 ]

2 голосов
/ 23 апреля 2019

Использование itertools.groupby с sorted:

import itertools

func = lambda x:x[0]
sorted_l = sorted([i.rsplit(' ', 1) for i in l], key=func)
{k: sum(map(int, list(zip(*g))[1])) for k, g in itertools.groupby(sorted_l, key=func)}

Вывод:

{'FC Awesome': 1, 'Grouches': 0, 'Lions': 5, 'Snakes': 1, 'Tarantulas': 6}
1 голос
/ 23 апреля 2019

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

li = ['Lions 1', 'Snakes 1', 'Tarantulas 3', 'FC Awesome 0', 'Lions 1', 'FC Awesome 1', 'Tarantulas 3', 'Snakes 0', 'Lions 3', 'Grouches 0']

dct = {}
for l in li:
    #Split only on last space
    name, count = l.rsplit(' ',1)
    if name in dct:
        dct[name] += int(count)
    else:
        dct[name] = int(count)

print(dct)
#{'Lions': 5, 'Snakes': 1, 'Tarantulas': 6, 'FC Awesome': 1, 'Grouches': 0}
1 голос
/ 23 апреля 2019

Вы можете использовать defaultdict и перебирать str.rsplit элементов в списке:

>>> from collections import defaultdict
>>> d = defaultdict(int)
>>> l = ['Lions 1', 'Snakes 1', 'Tarantulas 3', 'FC Awesome 0', 'Lions 1', 'FC Awesome 1', 'Tarantulas 3', 'Snakes 0', 'Lions 3', 'Grouches 0']
>>> for n, _, v in map(lambda s: s.rpartition(' '), l):
...     d[n] += int(v)
... 
>>> d
defaultdict(<class 'int'>, {'Lions': 5, 'Snakes': 1, 'Tarantulas': 6, 'FC Awesome': 1, 'Grouches': 0})

Этот алгоритм работает в O(n) без необходимости сортировки.

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