3

私は鍵付きlistのを持っています。すべての値は文字列です。しかし、いくつかの値は. のすべての新しい行と、その他のキーを削除する必要があります。だから、私はこれを行います:dict['name','content','summary',...]Nonecontentsummary

...
...
for item in item_list:
    name = item['name']
    content = item['content']
    if content is not None: content = content.replace('\n','')
    summary = item['summary']
    if summary is not None: summary = summary.replace('\n','')
    ...
    ...
...
...

私はif x is not None: x = x.replace('\n','')イディオムがあまり知的でなくきれいではない気がします。もっと「pythonic」またはそれを行うためのより良い方法はありますか?

ありがとう。

4

8 に答える 8

7

このコードは扱いにくいと感じますが、その理由の 1 つは、同じことを繰り返しているからです。これの方が良い:

def remove_newlines(text):
    if text is not None:
        return text.replace('\n', '')

for item in item_list:
    name = item['name']
    content = remove_newlines(item['content'])
    summary = remove_newlines(item['summary'])
于 2012-06-11T00:26:19.303 に答える
6

番兵値(なし)を使用する場合は、それらをチェックする必要があります。

あなたの質問にはさまざまな答えがありますが、この点が欠けているようです。エントリがない場合に同じ情報がエンコードされる場合は、辞書で番兵の値を使用しないでください。

例えば:

bibliography = [
    { 'name': 'bdhar', 'summary': 'questioner' },
    { 'name': 'msw', 'content': 'an answer' },
]

その後、あなたはすることができます

for article in bibliography:
    for key in article:
        ...

そして、ループは、特定の記事にどのキーが含まれているのかをうまく認識していません。

あなたのコメントを読むことで、あなたはあなたがどこかから口述を受けていると主張します。したがって、最初にジャンク値を削除します。あなたのコードを通して彼らの誤解を伝えることよりも、クリーニングのステップを持っている方がはるかに明確です。

于 2012-06-11T00:48:15.443 に答える
5

Python には三項演算子があるため、1 つのオプションは、より自然な語順でこれを行うことです。

content = content.replace('\n', '') if content is not None else None

""あなたのケースでとNoneが同等である場合 (そうであるように見えます)、if content空でない文字列は に評価されるため、単に に短縮できることに注意してくださいTrue

content = content.replace('\n', '') if content else None

これは Python の明示的イディオムに従い、暗黙的よりも優れています。これは、値がNone非常に明確である可能性があるコードに従っている人を示しています。

この操作を何度も繰り返す場合は、関数としてカプセル化する価値があることに注意してください。

Python のもう 1 つの慣用句は、許可ではなく、許しを求めることですtryしたがって、単純にand を使用exceptすることもできますがAttributeError、この場合、これは非常に冗長になるため、特にチェックのコストが非常に小さいため、おそらく価値がありません。

try:
    content = content.replace('\n', '')
except AttributeError:
    content = None
    #pass #Also an option, but as mentioned above, explicit is generally clearer than implicit.
于 2012-06-11T00:22:31.473 に答える
2

1 つの可能性は、None の代わりに空の文字列を使用することです。これは完全に一般的な解決策ではありませんが、多くの場合、データがすべて単一の型である場合、None 以外の適切な "null" 値 (空の文字列、空のリスト、ゼロなど) が存在します。この場合、空の文字列を使用できるようです。

于 2012-06-11T00:22:43.350 に答える
2

試す:

if content: content = content.replace('\n','')

--

if content0、False、または None 以外のものが含まれている限り(ほぼ1 ) 常になります。Truecontent


1 Lattyware がコメントで正しく指摘しているように、これは厳密には真実ではありません。空のリストなど、ステートメントでFalse評価されるものは他にもあります。if以下のコメントにあるリンクを参照してください。

于 2012-06-11T00:23:00.000 に答える
2

空の文字列は Python では False と評価されるため、Pythonic の方法はif content:.

In [2]: bool("")
Out[2]: False

In [3]: bool("hello")
Out[3]: True

補足ですが、コードをもう少し明確にすることができます:

name, content = item["name"], item["content"]

と:

content = content.replace('\n','') if content else None
于 2012-06-11T00:24:20.327 に答える
2

if 句の一部を別の関数に抽象化することも検討してください。

def remove_newlines(mystr):
    if mystr:
        mystr = mystr.replace('\n')
    return mystr

(辞書などで過度に複雑なソリューションを削除するために編集されました)

于 2012-06-11T00:32:13.553 に答える
1

「pythonic」のことは、 if ステートメントで None が False と評価されるという事実を使用することだと思います。だからあなたはただ言うことができます:

if content: content = content.replace('\n','')
于 2012-06-11T00:24:25.363 に答える