类似字符串处理的干版

问题描述:

什么是做到以下几点更有效的方式:类似字符串处理的干版

directors = get_element_or_none(title_node, 'Director') 
producers = get_element_or_none(title_node, 'Producer') 
writers = get_element_or_none(title_node, 'Writer') 

if directors: 
    directors = [director.strip() for director in directors.split(',')] 
if producers: 
    producers = [producer.strip() for producer in producers.split(',')] 
if writers: 
    writers = [writer.strip() for writer in writers.split(',')] 
+0

什么*下*的一部分? – 2013-02-10 22:53:22

+0

请注意,您的“董事”等是*东西*虚假或列表;不应该总是列表吗? – 2013-02-10 22:54:14

要始终产生一个列表(可能为空):

directors = [director.strip() for director in directors.split(',')] if directors else [] 
# etc. 

或使用map(str.strip, ...)

directors = map(str.strip, directors.split(',')) if directors else [] 

但在Python 3中需要明确调用list()

directors = list(map(str.strip, directors.split(','))) if directors else [] 

因为map()改为返回一个迭代器。

或使用一个辅助功能:

def tolist(commaseparated): 
    return [s.strip() for s in commaseparated.split(',')] if commaseparated else [] 

directors = tolist(directors) 
producers = tolist(producers) 
writers = tolist(writers) 

,或者与地图版本:

def tolist(commaseparated): 
    return map(str.strip, commaseparated.split(',')) if commaseparated else [] 

的分裂和剥离操作很可能被合并成一个功能与get_element_or_none()电话,但这取决于你还可以使用其他功能。

不是很激进,但是:

def clean_element(node, tag): 
    elements = get_element_or_none(node, tag) 
    if elements: 
     elements = [element.strip() for element in elements.split(',')] 
    return elements 


directors = clean_element(title_node, 'Director') 
producers = clean_element(title_node, 'Producer') 
writers = clean_element(title_node, 'Writer') 

得就像两个*自行车。

import functools 
get_them = functools.partial(clean_element, title_node) 

directors = get_them('Director') 
producers = get_them('Producer') 
writers = get_them('Writer') 

效率在重用中测量。

如果您的目的是干的 - 在不重复的东西,并引入更多机会的错误 - 什么是这样的:

cast={} 
for title in ('Director','Prodcer','Writer'): 
    name=get_element_or_none(title_node, title) 
    if name: 
     cast [title]=[x.strip() for x in name.split(',')]