17

事前定義されたセパレータを使用して、変数を1つの文字列に結合するクリーンな方法を探しています。問題は、これらの変数の一部が常に存在するとは限らないか、Noneに設定できる場合があることです。区切り文字列を複製することもできません。問題の例:

# This works because I have all strings
str('-').join(('productX', 'deployment-package', '1.2.3.4'))
# 'productX-deployment-package-1.2.3.4'

# But I have more args that might be None / or not exist like and that breaks
str('-').join(('productX', 'deployment-package', '1.2.3.4', idontexist, alsonotexist))
str('-').join(('productX', 'deployment-package', '1.2.3.4', None, None, None))

# If I set the other missing variables to empty strings, I get duplicated joiners
str('-').join(('productX', 'deployment-package', '1.2.3.4', '', '', ''))
# 'productX-deployment-package-1.2.3.4---'

これを行うための良いクリーンな方法はありますか?

4

3 に答える 3

27

内包表記を使用して、値が真の値を持っていることを条件付きで反復可能に設定できます。

your_list = [
  'productX', 
  'deployment-package', 
  '1.2.3.4', 
  None, 
  None, 
  None,
]

'-'.join(item for item in your_list if item)
于 2012-06-20T12:14:33.930 に答える
6

アイテムの数を一定に保ちたい場合 (たとえば、リストが行で、各アイテムが列を表すスプレッドシートに出力したい場合)、次を使用します。

your_list = ['key', 'type', 'frequency', 'context_A', None, 'context_C']
'\t'.join(str(item) for item in your_list)

ところで、これは、結合したいアイテムのいずれかが整数である場合の方法でもあります。

于 2013-03-07T12:32:25.943 に答える
5

False、None、0、[]、()、{}、''、その他など、bool に変換されたときに False と評価されるものはすべて filter(bool, your_list)orを使用して削除できます。filter(None, your_list)

locals().get('mightnotexist')変数がローカルかグローバルかによって、またはを使用globals().get('mightnotexist')して、存在しない可能性のある変数を参照できます。変数が存在しない場合、これらは None を返します。

コードは次のようになります。

items = ('productX',
         'deployment-package',
         '1.2.3.4',
         locals().get('idontexist'),
         globals().get('alsonotexist'),
         None,
         None,
         '')
'-'.join(filter(bool, items))
于 2015-02-28T04:40:27.530 に答える