0

次のことを行うためのより効率的な方法は何でしょうか。

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(',')]
4

3 に答える 3

1

常にリストを生成するには (おそらく空):

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 []

split-and-strip 操作は、おそらく呼び出しで 1 つの関数にマージできますが、それはその機能をget_element_or_none()他に何に使用するかによって異なりますtolist()

于 2013-02-10T22:54:49.547 に答える
0

それほど急進的ではありませんが:

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')

2 輪の自転車のように過激です。

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

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

再利用で測定された効率。

于 2013-02-10T23:00:18.503 に答える
0

あなたの意図がDRYである場合-何かを繰り返さず、エラーの可能性を高めるなど-次のようなものはどうですか:

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-10T23:01:02.643 に答える