2016-08-02 14 views
1

いくつかのジェネレータ式をPythonのjoinメソッドに入力するにはどうすればよいですか?私は働かない以下のことを試しました。 Python 2.xと3.xを使用すると違いはありますか?私の正確なバージョンはPython 2.7.12です。ジェネレータ式をPythonのjoinメソッドへの入力として入れる方法は?

def productList(self, obj): 
    return ", ".join([w.name for w in obj.someProducts.all()],[w.code 
         for w in obj.someProducts.all()]) 

[]

def productList(self, obj): 
     return ", ".join(w.name for w in obj.someProducts.all(),w.code 
         for w in obj.someProducts.all()) 

入力なし:

Product table 
    Name: Char; 
    Code: Char; 

出力:

name1code1, name2code2 
+2

あなたの結果は何ですか?ジェネレータ式は1つだけで、文字列を生成する必要があります。私たちにいくつかの入出力を与えてください。 – Bahrom

+1

あなたはそれぞれの 'join'呼び出しの中でlist-comprehensionまたはgeneratorの表現を複製しました。あなたは本当にすべての名前を2回欲しいですか? – Blckknght

+0

申し訳ありません私の質問を編集しました。製品の名前とコードを表示する必要があります。 – Devone

答えて

2

名前とコードを表示したい場合は、あなただけ結合する必要がありますあなたはtwを必要としません発電機。

', '.join(w.name + ':' + w.code for w in obj.someProducts.all()) 

または文字列の書式:

', '.join('{name}: {code}'.format(name=w.name, code=w.code) for w in obj.someProducts.all()) 

それとも別の参加(あなたがそれに発電機を与えることができない限り、お勧めできません - 別のリストを作成することは無駄であるが、これは巣が加入方法することができます実証)

サイドノートでは
', '.join(':'.join([w.name, w.code]) for w in obj.someProducts.all()) 

、Pythonの3.6は、私はWORで3.6を持っていないので、(私は、自宅でこれをテストしますあなたはこのような何かを行うことができる必要がありますを意味し、Literal String Interpolationを紹介k;誰かがこれが実際に動作することを確認できますか? )私はそれがない場合、私はそれを削除します知ってみましょう:

', '.join(f'{w.name}: {w.code}' for w in obj.someProducts.all()) 
+1

私は 'str.format'を、余分な' join'呼び出しではなく、2つの属性を組み合わせるもっと自然な方法として提案したいと思います。 – Blckknght

+0

公正なポイント、更新、ありがとう! – Bahrom

2

はそれを試してみる:

', '.join('{}{}'.format(w.name, w.code) for w in obj.someProducts.all()) 

を私はちょうどw.nameを作り、1つの文字列をw.code、ということ2つのリストは必要ありません。希望どおりにフォーマットを変更してください。

関連する問題