2013-05-16 70 views
0

我有以下代码:了解Python列表理解等同

listOfStrings = ['i_am_exercising', 'python_functional', 'lists_comprehension'] 
[ "".join([elem.title() for elem in splited]) for splited in [el.split("_")for el in listOfStrings]] 

这样做的结果是:

['IAmExercising', 'PythonFunctional', 'ListsComprehension'] 

阅读documentation,我得到了相当的扩展版本,这使第一表达在要附加的变量中,第二个表达式用for语句迭代:

returned = [] 
for splited in [el.split("_")for el in listOfStrings]: 
      returned.append("".join([elem.title() for elem in splited])) 

但是,如果我想编写没有任何列表理解相同的代码,如何做到这一点的最佳方式?我试着用下面的代码,效果很好:

returned = [] 
temp = [] 

for el in listOfStrings:     
    temp = []       
    for splited in el.split("_"):  
     temp.append(splited.title()) 
    returned.append("".join(temp)) 

但我没有完全了解如何做到这一点(变换列表理解为等效满扩展形式)

+1

迂腐点:' “”。加入(elem.title(),用于splited ELEM)'是* *技术上自由列表解析的,因为它直接传递发电机以'加入',而不是由使用相同生成器的列表理解创建的列表。但是这样的区分绕过你真正的问题:) – chepner

+0

感谢您的发电机=) –

回答

0

您可以轻松地向外向内转化:

listOfStrings = ['i_am_exercising', 'python_functional', 'lists_comprehension'] 

result = [ "".join([elem.title() for elem in split]) for split in [el.split("_")for el in listOfStrings]] 
print result 

result = [] 
for split in [el.split("_") for el in listOfStrings]: 
    result.append("".join([elem.title() for elem in split])) 
print result 

result = [] 
temp1 = [] 
for el in listOfStrings: 
    temp1.append(el.split("_")) 
for split in temp1: 
    result.append("".join([elem.title() for elem in split])) 
print result 

result = [] 
temp1 = [] 
for el in listOfStrings: 
    temp1.append(el.split("_")) 
for split in temp1: 
    temp2 = [] 
    for elem in split: 
     temp2.append(elem.title()) 
    result.append("".join(temp2)) 
print result 

基本上你只要按照下面的方案:

result = [foo for bar in baz] 

变成

result = [] 
for bar in baz: 
    result.append(foo) 
2

您同时拥有嵌套列表解析,一个在另一个里面,另外一个先创建一个拆分元素列表。您可以将此减少到只有两个循环,而不是:

returned = [] 
for el in listOfStrings: 
    tmp = [] 
    for splited in el.split("_"): 
     tmp.append(splited.title()) 
    returned.append("".join(tmp)) 

这简化回落到窗体列表理解:

["".join([splited.title() for splited in el.split("_")]) for el in listOfStrings]