TransWikia.com

Как построчно применить функцию к списку/переменной с переносами строк

Stack Overflow на русском Asked on December 16, 2021

import blockcypher
prev_data_lines_adr = ['14CaBzRbZDuGJCAdu9CZsbrCfyv4K7f7sf','0xd4FD252d7D2C9479a8d616F510eAC6243B5DDdf9']
for ln in prev_data_lines_adr:
    blockcypher.get_total_balance(ln)

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

One Answer

Для этого есть map, который первым параметром принимает метод, который должен возвращать что-то, а вторым итерируемый объект. Map применит метод к каждому элементу итерируемого объекта и вернет генератор.

a = tuple(map(lambla x: x + 1, [1,2,3]))
print(a)
# (2,3,4)

А еще можно воспользоваться любым из comprehension

# генератор
a = (x + 1 for x in [1,2,3])
print(a)
# генератор
print(*a) # сработает только один раз. генератор же.
# 2 3 4

# list
a = [x + 1 for x in [1,2,3]]
print(a)
# [2,3,4]

# tuple
a = tuple(x + 1 for x in [1,2,3])
print(a)
# (2,3,4)

С генератором, что удобно это то, что генератор будет выполняться по элементно при необходиомсти. Что может быть важно при работе например с большим файлом.

# например нам нужно прочитать файл построчно и убрать из каждой строки 
# переносы символов и пустые строки
with open("file.txt", "r") as source:
    lines = (x.strip() for x in source if x.strip())
# теперь у нас есть генератор lines, который еще ничего не сделал, 
# а делать он будет когда мы захотим проитерировать по нему 
# и делать будет по строчно.

Чаще всего включения получаются горадо понятнее чем применение map и filter

# Перепишем построчно один файл в другой без загрузки всего файла в ОЗУ.
# А также применим фильтр по длине строки

with open("source.txt", "r") as source, open("dest.txt", "w") as dest:
    _ = tuple(dest.write(x) for x in source if len(x) < 10)
# Перепишем построчно один файл в другой без загрузки всего файла в ОЗУ.
# А также применим фильтр по длине строки

with open("source.txt", "r") as source, open("dest.txt", "w") as dest:
    _ = tuple(map(dest.write, filter(lambda x: len(x) < 10, source)))

map и filter ленивые функции возвращающие генератор, который еще ничего не сделал. генератор итерируется только один раз и его нужно проитерировать для получения результатов.

Answered by alex on December 16, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP