Разбивая список на более мелкие списки в точке - PullRequest
0 голосов
/ 15 апреля 2020

Я написал функцию, которая принимает, например, [["a", 1], ["b", 2], ["a", 2], ["b", 3]], где каждый маленький list содержит букву и цифру и возвращает [["a", 1,2, "b", 2,3]].

Существует гораздо больше этой проблемы, но, чтобы упростить задачу, следующий шаг - превратить ее в форму [["a", 3], ["b", 5]]. Второй элемент каждого меньшего списка, это сумма чисел между буквами ie 1,2, которые связаны с «а», 2,3 связаны с «б», как видно из исходного списка. Количество вхождений буквы не ограничено.

Еще один пример Подводя итог: function ([["a", 1,3,4, "b", 2,2, "c", 4 , 5]]) => [["a", 8], ["b", 4], ["c", 9]]

Ничто из написанного мною не приблизилось к выполнению это. Это своего рода непростая задача, нет понимания списка и ничего нельзя импортировать

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Этот код может вам помочь:

#Assuming a random initial list:
data = [["a",1,3,4,4,2,"b",2,2,3,5,2,3,"c",4,3,5,5]]
#A empty list where it will be added the result:
new_data = []
#variable to acumulate the sum of every letter:
sume = 0

#FOR loop to scan "data" variable:
for i in data[0]: 
    #if type of i variable is string, we assuming it's a letter:
    if type(i) == str:
        #add accumulated sum
        new_data.append(sume)
        #we restart *sume* variable:
        sume = 0
        #we add new letter read:
        new_data.append(i)
    else:
        #we acumulate sum of each letter:
        sume += i

#we extract the 0 added initially and added the last sum:
new_data = new_data[1::]+[sume]

#Finally separate values in pairs with a FOR loop and add it to "new_data2":
new_data2 = []
for i in range(len(new_data)//2):
    pos1 = i*2
    pos2 = pos1+1
    new_data2.append([new_data[pos1],new_data[pos2]])

#print data and new_data2 to verify results:
print (data)
print (new_data2)   
#pause the script:
input()

Этот код может работать один раз по сценарию, но он может преобразовываться во вложенную функцию, чтобы использовать ее так, как вы ищете.

1 голос
/ 15 апреля 2020

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

Если ваш список всегда начинается с буквы или str, а все числа имеют тип int, вы можете использовать словарь для подсчета. Я добавил комментарии, чтобы объяснить логи c.

def group_consecutive(lst):
    groups = {}

    key = None
    for item in lst:

        # If we found a string, set the key and continue to next iteration immediately
        if isinstance(item, str):
            key = item
            continue

        # Add item to counts
        # Using dict.get() to initialize to 0 if ket doesn't exist
        groups[key] = groups.get(key, 0) + item

    # Replacing list comprehension: [[k, v] for k, v in groups.items()]
    result = []
    for k, v in groups.items():
        result.append([k, v])

    return result

Тогда вы могли бы вызвать функцию следующим образом:

>>> group_consecutive(["a",1,3,4,"b",2,2,"c",4,5])
[['a', 8], ['b', 4], ['c', 9]]

Лучшее решение, вероятно, будет использовать collections.Counter или collections.defaultdict, чтобы сделать подсчет, но так как вы упомянули отсутствие импорта, то вышеупомянутое решение придерживается этого.

...