我有许多代码行,这些代码行非常重复,只有一个整数不同。
def my_function(row):
ozone = row[1].text.replace('\xa0', ' ').split(' ')[0]
no2 = row[2].text.replace('\xa0', ' ').split(' ')[0]
so2 = row[3].text.replace('\xa0', ' ').split(' ')[0]
pm10 = row[4].text.replace('\xa0', ' ').split(' ')[0]
return {'ozone': ozone, 'no2': no2, 'so2': so2, 'pm10': pm10}
如果可能的话,我想通过执行以下操作来清理此代码:
def my_function(row):
foo = row[{}].text.replace('\xa0', ' ').split(' ')[0]
return {'ozone': foo.format(1), 'no2': foo.format(2), 'so2': foo.format(3), 'pm10': foo.format(4)}
显然str格式方法不起作用,但希望你能看到我的目标。我怎么能以pythonic的方式做到这一点?
答案 0 :(得分:1)
您可以遍历一片row
,处理每个项目并使用字典键压缩结果:
def my_function(row):
keys = ('ozone', 'no2', 'so2', 'pm10')
values = [x.text.replace('\xa0', ' ').split(' ')[0] for x in row[1:5]]
return dict(zip(keys, values))
答案 1 :(得分:1)
您可以删除替换的重复内容,但为了便于阅读,我仍保留相同的行数。
template <typename F, std::size_t... Is>
void repeat_unrolled_impl(F&& f, std::index_sequence<Is...>)
{
(f(std::integral_constant<std::size_t, Is>{}), ...);
}
template <std::size_t Iterations, typename F>
void repeat_unrolled(F&& f)
{
repeat_unrolled_impl(std::forward<F>(f),
std::make_index_sequence<Iterations>{});
}
答案 2 :(得分:1)
您可以拆分两个功能,一个执行替换,拆分和返回。而你最初的另一个。第二个包含组,其中组中的每个条目都包含行索引及其映射到的键。
def replace_split_and_return_first(text):
return text.replace('\xa0', ' ').split(' ')[0]
def my_function(row):
groups = [(1, 'ozone'), (2, 'no2'), (3, 'so2'), (4, 'pm10')]
return {key: replace_split_and_return_first(row[idx].text) for (idx, key) in groups}