类似字符串处理的干版
问题描述:
什么是做到以下几点更有效的方式:类似字符串处理的干版
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(',')]
答
要始终产生一个列表(可能为空):
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(',')]
什么*下*的一部分? – 2013-02-10 22:53:22
请注意,您的“董事”等是*东西*虚假或列表;不应该总是列表吗? – 2013-02-10 22:54:14