删除只有一个列表索引值不同的冗余代码行

时间:2017-09-18 10:34:09

标签: python

我有许多代码行,这些代码行非常重复,只有一个整数不同。

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的方式做到这一点?

3 个答案:

答案 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}