2012-06-20 13 views
7

Değişkenleri, tek bir dizeye önceden tanımlanmış bir ayırıcıyla birleştirmenin temiz bir yolunu arıyorum. Sorun şu ki, bazen bu değişkenlerin bazıları her zaman mevcut değildir veya Yok olarak ayarlanabilir. Ayırıcı dizgisini de kopyalayamıyorum. Sorunun Örnek:Birleştirilebilen İçeren Dizeleri ve (YokType/Tanımsız) birleştirme dizesi

# 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---' 

Bunu yapmak için güzel temiz bir yolu var mı?

+4

'kullanmak '-' ('-') yerine str' arasında join' ben kendi cevap bu tercih – jamylak

cevap

16

Sen değerler truthy değere sahip bir şartlı denetimi ile sizin iterable doldurmak için bir anlama kullanabilirsiniz. kullanmak, sen sürekli öğelerin sayısını korumak istiyorsanız

your_list = ['productX', 'deployment-package', '1.2.3.4', None, None, None] 
'-'.join(item for item in your_list if item) 
+1

join', bunun nedeni de kolları OP istediği gibi boş dizeler. –

+0

, boş dizelerle de çalışmasını sağlamak için item.strip() öğesinde kullanılır. "Item.strip() eğer" gibi Yok ya şeridini (desteklemeyen herhangi diğer bir nesne üzerinde başarısız olur –

+0

Ne hakkında) –

2

(örneğin liste bir satır olan bir elektronik tabloya çıktı istedikleri için ve her öğenin bir sütunu temsil):

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

BTW Bu, katılmak istediğiniz öğelerin tam sayı olması durumunda da devam etmenin yoludur.

+0

bunun sende yolu, o kadar ' 'tuşuna, tipi, frekans, context_A, Yok, context_C'' gibi dizede değerini' None' koyarsa. Çoğu insanın kullanması için boş bir dize isteyeceğini düşünüyorum. Bunun için ben '', 'kullanın. (öğe veya 'katılmak' your_list öğenin)' 'almak için' tuşuna, türü, sıklığı, context_A ,, context_C''. Ancak, str() 'sarmalayıcısını düşürmem gerektiğinden, tamsayıları dönüştürmek için kullanamazsınız. Eğer müsaade değerlerden biri Yok nerede girişi doğrulayarak için gerçekleşmesi durumunda –

+0

bu büyük bir çözümdür. –

1

Sen filter(bool, your_list) ya filter(None, your_list) böyle Yanlış, Yok, 0 gibi bir bool dönüştürüldüğünde yanlış olarak değerlendirilir şey, [],(), {}, '' belki diğerlerini kaldırmak için kullanabilirsiniz.

locals().get('mightnotexist') veya globals().get('mightnotexist'), değişkenin yerel veya global olması gerekip gerekmediğine bağlı olarak var olmayan bir değişkeni referans olarak kullanabilirsiniz. Eğer değişken mevcut değilse, bunlar None değerini döndürür.

Kodunuz hale gelebilir.:. Daha iyi

items = ('productX', 
     'deployment-package', 
     '1.2.3.4', 
     locals().get('idontexist'), 
     globals().get('alsonotexist'), 
     None, 
     None, 
     '') 
'-'.join(filter(bool, items)) 
+0

Bu çözümü tercih ediyorum çünkü benim görüşümde daha okunaklı. –

İlgili konular