Как добавить числа между строками в списке? - PullRequest
0 голосов
/ 01 июня 2019

У меня смешанный список со строками и целыми числами, и мне нужно получить сумму чисел между каждой строкой.В идеале конечным результатом должен быть список кортежей, поскольку каждая строка и следующие числа принадлежат друг другу (поэтому порядок важен).

Я могу извлечь число с помощью итерации, используя isinstance, но фактический список очень большой иУ меня иногда есть 1 или 2 числа для каждой строки.

my_list = ['a', 2, 1, 'b', 3, 'h', 50, 4, 'd', 4, 'v', 20, 7]

ideal_output = [('a', 3) ('b', 3), ('h', 54), ('d', 4), (v, 27)]

Ответы [ 3 ]

2 голосов
/ 01 июня 2019

Вот решение, использующее itertools.groupby :

my_list = ['a', 2, 1, 'b', 3, 'h', 50, 4, 'd', 4, 'v', 20, 7]

from itertools import groupby

groups = groupby(my_list, key=type) # group-by the type of the value

result = []
for key, group in groups:
    string = next(group) # get the string first, we'll skip over it otherwise
    if key is str:
        _, values = next(groups) # move the generator forward to get to the numbers
        result.append((string, sum(values))) # sum up the numbers
print(result)

Выход:

[('a', 3), ('b', 3), ('h', 54), ('d', 4), ('v', 27)]

Предполагается, что между строками будет хотя бы одно число. Если нет, вы можете проверить len из g и, если это больше 1, добавить 0 для значения первого значения в g

0 голосов
/ 01 июня 2019

С functools.reduce Функция:

from functools import reduce

def accum(prev, curr):    # prev - previous item, curr - current item
    if prev == [] or isinstance(curr, str):
        prev.append((curr, 0))
    elif isinstance(curr, int):
        prev[-1] = (prev[-1][0], prev[-1][1] + curr)
    return prev

my_list = ['a', 2, 1, 'b', 3, 'h', 50, 4, 'd', 4, 'v', 20, 7]
res = reduce(accum, my_list, [])   # [] is initializer
print(res)

Выход:

[('a', 3), ('b', 3), ('h', 54), ('d', 4), ('v', 27)]
0 голосов
/ 01 июня 2019

Вы можете просто использовать простую итерацию и без groupby, это будет немного быстрее, потому что она делает только один проход:

my_list = ['a', 2, 1, 'b', 3, 'h', 50, 4, 'd', 4, 'v', 20, 7]
new_list = []
new_element = []
for element in my_list:
    if isinstance(element, str):
        if new_element:
            new_list.append(tuple(new_element))
        new_element = [element, 0]
    else:
        new_element[1] += element
if new_element:
    new_list.append(new_element)
print(new_list)

Выход:

[('a', 3), ('b', 3), ('h', 54), ('d', 4), ('v', 27)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...