2016-04-11 37 views
2

我有形式的名单列表:如何在Python中重构四个缩进级别?

items = [["Wello \nWorld", "roboto.ttf", "rgb(0,0,0)"], ["StackOverflow is awesome", "roboto.ttf", "rgb(255,255,255)"]] 

我想要做的就是去在每个list ...声明变量textfontcolor。之后,将文本分成若干行,如果其上有\n个字符,然后将这些行分隔成单词以便与它们进行一些处理。

下面是我用来实现这个目标的代码。

def wrap(self, size): 
    for section in sections: 
     for text, font, color in section: 
      for line in text.splitlines(): 
       for word in line: 
        pass 

我知道这个功能是错误的。如果没有错,那么这个世界就是错的。这种缩进程度看起来很丑陋,真的希望你们能帮助我以另一种方式来表达。或者,也许数据是错误的 - 结构?

一件事:

平优于嵌套:

我从The Zen of Python读取。

这是否适用于我的问题?我敢打赌,但是我在Google Groups上阅读了一些内容,并且在提到时,人们倾向于引用Python程序包和继承层次结构。Flat比嵌套要好。

+0

通常,当我看到深层嵌套的代码块时,首先要做的是查看是否有任何这些块可以作为逻辑单元移动到单独的函数中。你的'wrap()'函数似乎做了很多。 'sections'循环的主体可能被移动到'process_section()'函数中。我会考虑把生产线移到它自己独立的功能上。 –

+0

您显示的'items'似乎对应于代码中的'section',因此您的示例数据缺少代码反映的嵌套级别。你的字符串也是字符串的编码列表,占其他额外的级别。您的代码将与您要分析的数据一样嵌套。 – chepner

回答

3

“扁平优于嵌套”指保持数据结构简单并避免将太多对象嵌套在另一个中。在你的情况下,你有一个列表清单,所以这只是两个级别,不是太糟糕。实际上,你有一个三元组列表(是的,“元组”是一个列表,但它仍然是一个固定的大小),所以它根本就没有问题。

既然你只有一个级别,你只需要一个for循环来访问该元组。然后你就可以把它解析访问这些元素和进一步处理text

for section in items: 
    text, font, color = section 
    text = text.splitlines() 
    print(text, font, color) 

这将使你:

['Wello ', 'World'] roboto.ttf rgb(0,0,0) 
['StackOverflow is awesome'] roboto.ttf rgb(255,255,255) 

根据您想使用这些值进一步做什么,你可能需要一个更多的嵌套遍历文本的行,但这不是一个问题,所以你可以做到这一点。

相关问题