2011-06-23 15 views
2

私はPythonでこれが可能であることを知っている:ワンライナーは可能ですか?

、「連想リストは、」URLのリストである。この

のようなものを私は出力のhrefタグのリストを生成しますHTML文字列をできると仮定すると、
'\n'.join(alist) 

'<a href="'.join(alist) 

私は上記が間違っていることを知っていますが、これを行うよりスマートな方法があるのだろうかと思っていました。私は作品で次のことを行っている:

for u in adict[alist]: 
    fileHandle.write('<a href="' + u + '">' + u + '</a><br>')  

を基本的には、何らかの形で参加文でループのために上記を交換する方法はありますか?おそらく1ライナーですか?

+3

これは、出力HTMLに恐ろしい方法です。例えば、 'u'が二重引用符やアンパサンドや山括弧を含むとすぐに改行されます。テンプレートシステムを使用するか、少なくとも明白な問題に対して基本的な検証/エスケープを追加してください。 – delnan

答えて

6

あなたはgenerator expressionを探しています:

''.join('<a href="' + u + '">' + u + '</a><br/>' for u in adict[alist]) 

あなたが参加することを文字列に<br/>を移動し、最後の項目の後に<br/>をしたくない場合。

また、ここではadict[alist]にHTMLコードが含まれていると仮定しています。テキストが含まれている場合は、uhtml.escape()に置き換えてください(を&lt;と置き換え、"&quot;と置き換えてください)。それ以外の場合は、Cross-Site scriptingの脆弱性(およびレンダリングのバグ)を導入しています。

+0

+1あなたはPythonで何でもできます! –

+2

'
'は、おそらくは – ThiefMaster

+0

と結合する文字列になります@ThiefMaster通知を追加しました。 – phihag

1

はい

fileHandler.write('<br/>\n'.join('<a href="%(url)s">%(url)s</a>' % {'url':u} for u in adict[alist]) 

EDITED:以下についてはどのように

+0

'writelines'または' '\ n'.join(..) '両方を使用すると、すべての文字の後に改行が返されます – phihag

+0

しかし、これを実行しましたコードを数回ローカルに作成すると正しい結果が得られます。私は間違っていますか? –

+0

ああ、私の間違いです。しかし、それを使用することはまだ不必要で、追加のオーバーヘッドを導入する可能性があります。また、それはあなたがしていることをわかりません。シーケンスとしての文字列の再解釈は明らかではありません。なぜあなたは 'writeline'を単に' write'よりも好むのですか? – phihag

1

writeメソッドを使用して、改行を使用して結果を参加するように変更し、 '
' タグ?

['<a href="{0}">{0}</a><br>'.format(u) for u in alist] 

更新:

fileHandler.write('<br />\n'.join('<a href="{0}">{0}</a>'.format(u) for u in alist) 
+0

+1新しいスタイルの文字列の書式を使用する。 phihagの答えのように 'join'を追加したいかもしれません。 –

関連する問題