2011-08-06 11 views
0

入力文字列(曲名)のリストをソートするプログラムを作成しています。 これらの曲名には、$ \ lambda $のようなラテックス文字が含まれています。 は、代わりに 'lambda'のようにソートされます。私はソート中に各要素に 関数を適用する機能を使用しています。このような:''を '\'に変換するPython

# -*- coding: UTF8 -*- 
def conv(inp): 
    if inp == '$\lambda$': 
     return 'lambda' 
    else: 
     return inp 

mlist = [] 
mlist.append('martin') 
mlist.append('jenny') 
mlist.append('åse') 
mlist.append('$\lambda$') 
mlist.append('lambda') 
mlist.append('\her') 
print (mlist) 
mlist = sorted(mlist, key=conv(str.lower)) 
print (mlist) 

しかし、私はそれが\\herまたは$\\lambda$に変換lambda看板や\herを追加し、いくつかの理由で、私はこれを防ぐことができますか?

+1

あなたが別のバックスラッシュであなたのバックスラッシュをエスケープていることを確認してくださいを行う必要があり、さらにr'$\lambda$'を使用する必要があるということです。 '' $ \\ lambda $ ' –

答えて

6

しかし、いくつかの理由で、私はlambda記号を追加したり\herとき、それは\\herまたは$\\lambda$に変換...

んが、それはdoesnのありません't。あなたが見ているのはの表現です。明瞭にするためにソロのバックスラッシュは常に2倍です。 実際の文字列を印刷すると、代わりに正常であることがわかります。

+0

ありがとうございます。今私は並べ替え/置き換え物に問題があります。 私は を使用しています。[] =ソート済み(key = str.replace( '$ \ lambda $'、 'lambda')) しかし、replaceは1つの引数しか得ていません... – Martinnj

+0

別々の質問を別々の質問として投稿する必要があります。 –

1

としては、すでにあなたのバックスラッシュをエスケープする必要があり提案:

'$\\lambda$' 

別の方法としては、特殊文字置換の対象とならない生の文字列を、使用することです:あなたは、生の多くのバックスラッシュを持って

r'$\lambda$' 

文字列がより明確になる傾向があります。

+1

' \ l'はエスケープシーケンスではなく、 '$ \ lambda $' 'は' r '$ \ lambda $' 'と同じ文字列を生成します。 –

+0

@Cat Plus Plus:そうです、^ Lと混同しました。だから私の提案は似たような文脈で賢明であるが、質問に答えない。 –

1

これは期待される動作です。リストに格納されている文字列が表示されているため、ダブルスラッシュはエスケープされたスラッシュを意味します。実際の文字列を見たい場合は、リストではなく文字列を出力するだけです。あなたのプログラムに次の行を追加しよう:

print (' '.join(mlist)) 
2

コードに何も問題はありません:発生していることはreprです。リストを印刷すると内容が再現され、repr\をエスケープします。あなたはreprせずにリストを印刷したい場合は

print repr(r'\foo') # => '\\foo' 

は、あなたがループまたはstr.joinのいずれかを使用します。

0

ポイントは、あなたがそれを

を印刷するには、各要素ののreprを印刷リストを印刷するとき、あなたが

from __future__ import print_function 
print (*mlist) 
関連する問題