У меня проблема с моим кодом:

Постановка задачи: Подсчитайте два последовательных числа в списке в словаре.

Например: если список [2,1,0,2,2,2], то ответ будет 3, т.е. (2,2) и (2,2)

Это код, который я написал

import ast
def calstats(data_dict):
    consec2Cnt = 0
    for key,value in data_dict.items():
        for i in range(len(value)-1):
            if int(value[i]) == int(value [i+1]) and int(value[i]) == 2 and int(value[i+1]) == 2:
                consec2Cnt += 1
    return(consec2Cnt)
    #print(str(consec2Cnt))

sumCnt = 0
fileinput = open("1.txt",'r')
lines = fileinput.readlines()
data_dict = {}
for eline in lines:
    data_dict = eline.strip()
    sumCnt += calstats(ast.literal_eval(data_dict))
print(sumCnt)

Ссылка на файл приведена здесь

Конечный результат, который я получаю,

205

, Но правильный ответ

213

, Я делаю что-то неправильно?

0
U-571 23 Фев 2018 в 12:26

3 ответа

Лучший ответ

Это похоже на случай с itertools.groupby:

from itertools import groupby

mylist = [2,2,0,1,1,2,2,2,2,1,1,0,0,2,2,2,0,2]

n = sum(len(list(v))-1 for k, v in groupby(mylist) if k == 2)

#output
6

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

2
Mr. T 23 Фев 2018 в 12:51

Будет ли что-то вроде этой работы?

yourList = [3, 2, 2, 4, 3, 3, 2] 

def counter(a):
  b = 0
  x = 0
  for i in a:
    if i == b and i == 2:
      x += 1 
    b == i
  return x

print(counter(yourList))
0
James Sharkey 23 Фев 2018 в 10:11
a = [3, 2, 2, 2, 4, 2, 2, 2]
count = 0
for i in range(len(a)-1):
    if a[i: i+2] == [2, 2]:
        count += 1
print(count)

Вывод: 4

0
Jai 23 Фев 2018 в 10:12