Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Как разделить все целые числа в массиве на отдельные разряды?

#python


Доброго времени суток! Интересует такой вопрос.
Предположим, что существует вот такой код:    

а = list(range(1,11))  
print(a)  


Он будет выводить [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Вопрос у меня такой: есть ли возможность каким-то образом разделить двухзначное число
10 на два отдельных элемента листа, т.е. чтобы по итогу лист выглядел так:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0]

Если интересует вопрос а "нафига" вообще это нужно, могу объяснить.
Задача следующая: составить список чисел от a до b (они задаются пользователем),
затем посчитать сколько раз встречаются определенные цифры и вывести результат на экран.
Для определения цифр я использую функцию count (а-ля b = a.count(1)), но естественно
цифра один встречается лишь один раз (что печально, но неудивительно).
Надеюсь на ваши советы. Возможно (а даже скорее всего), есть гораздо более легкий
способ решения данной задачи, но мы легких путей не ищем.  

Всем спасибо за подробные ответы! Протестирую все представленные решения!   
    


Ответы

Ответ 1



Можно взять простое (в лоб), но не самое производительное решение: input_numbers = [123, 987123, 0, 1, 2, 5] output_digits = [] for number in input_numbers: output_digits.extend(map(int, str(number))) print(output_digits) >>> [1, 2, 3, 9, 8, 7, 1, 2, 3, 0, 1, 2, 5] Можно взять решение иное, сразу считающее цифры. Более красивое, на мой взгляд: from collections import Counter counters = [Counter(str(number)) for number in input_numbers] result = Counter() for counter in counters: result += counter print(result) >>> Counter({'1': 3, '2': 3, '3': 2, '9': 1, '8': 1, '7': 1, '0': 1, '5': 1}) решение это еще можно сократить, убрав массив счетчиков, сразу забирая элементы из начального массива - массив counters здесь для наглядности. Можно сократить и далее, сократив все решение до одной строки: result = sum([Counter(str(number)) for number in input_numbers], Counter()) Counter очень быстр - у вас не возникнет с ним проблем с производительностью, каким бы большим не был входной массив. Также помимо сложения, у счетчика есть и иные операции - загляните в документацию, чтобы ознакомиться - там есть и вычитание, и объединение (union) и много других интересностей.

Ответ 2



a = 123456 b = map(int, str(a)) print b или b = [] while a > 0: b.append(a % 10) a = a // 10 b = b[::-1] # так можно развернуть, если бы нам был важен порядок print b

Ответ 3



In [69]: input_list = [1, 2, 456, 7, 8, 10] In [70]: result = [int(x) for x in str(input_list) if x.isdigit()] In [71]: result Out[71]: [1, 2, 4, 5, 6, 7, 8, 1, 0] Вариант с regex In [88]: import re In [89]: pattern = re.compile(r'-?\d') In [90]: foo = lambda array: [int(value) for value in re.findall(pattern, str(array))] In [91]: foo([1, 2, 10, 15, -23, -47]) Out[91]: [1, 2, 1, 0, 1, 5, -2, 3, -4, 7] По поводу повторения, выше уже был вариант с Counter, предложу свой: num_list = [1, 1, 2, 3, 3] result = { num : num_list.count(num) for num in set(num_list) } print(result) # {1: 2, 2: 1, 3: 2}

Ответ 4



Доброго времени суток! Данный кусок "кода" работает только с указанным Вами примером. Спасибо! #Monkey code a=list(range(1,11)) print(a) #Вернет [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] #--------------------------------- #работает только с натуральными числами и нулем #a="".join(str(a) for a in a) #соединяет массив в строку #print(a) #Вернет "12345678910" #---------------------------------- #a=list(a) #разобьет полученную строку поэлементно #print(a) #Вернет ['1', '2', '3', '4', '5', '6', '7', '8', '9', '1', '0'] #---------------------------------- #a=list(int(a) for a in a) #Преобразует все элементы массива в int #print(a) #Вернет [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0] #---------------------------------- a=list("".join(str(a) for a in a)) a=[int(a) for a in a] print(a)

Комментариев нет:

Отправить комментарий