2012-06-20 17 views
7

Tôi đang tìm một cách sạch sẽ để kết hợp các biến thành một chuỗi đơn với dấu tách được xác định trước. Vấn đề là đôi khi một số biến này không tồn tại hoặc có thể được đặt thành Không. Tôi không thể có chuỗi phân cách trùng lặp hoặc. Ví dụ về sự cố:Chuỗi Ghép từ Iterable chứa Strings và (NoneType/Undefined)

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

Có cách nào tốt đẹp để làm điều này?

+4

Tốt hơn để sử dụng ' '-' join' thay vì' str ('-') join' – jamylak

Trả lời

16

Bạn có thể sử dụng hiểu để điền vào có thể lặp lại của bạn với kiểm tra có điều kiện rằng các giá trị có giá trị trung thực.

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

Tôi thích này để trả lời của riêng tôi, bởi vì nó cũng xử lý các chuỗi rỗng như OP muốn. –

+0

sử dụng 'if item.strip()' để làm cho nó hoạt động với các chuỗi rỗng. –

+0

Bạn không thể sử dụng "if item.strip()" vì nó sẽ không thành công trên None hoặc bất kỳ đối tượng nào khác không hỗ trợ dải() –

2

Nếu bạn muốn giữ số lượng các mục không đổi (ví dụ bởi vì bạn muốn để xuất ra một bảng tính mà danh sách là một hàng và mỗi mục đại diện cho một cột), sử dụng:

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

BTW đây cũng là cách để đi nếu bất kỳ mục nào bạn muốn tham gia là số nguyên.

+0

Cách bạn có cái này, nó đặt giá trị 'None' trong chuỗi như vậy '' khóa, kiểu, tần số, context_A, None, context_C''. Tôi nghĩ rằng hầu hết mọi người sẽ muốn một chuỗi rỗng được sử dụng. Cho rằng tôi sử dụng '','. Join (mục hoặc '' cho mục trong your_list)' để có được ''khóa, loại, tần số, context_A ,, context_C''. Tuy nhiên, vì tôi đã phải bỏ trình bao bọc 'str()', bạn không thể sử dụng nó để chuyển đổi các số nguyên. –

+0

đây là một giải pháp tuyệt vời nếu bạn tình cờ xác thực đầu vào trong đó một trong các giá trị được phép là Không. –

1

Bạn có thể sử dụng filter(bool, your_list) hoặc filter(None, your_list) để xóa bất kỳ thứ gì đánh giá thành Sai khi chuyển thành bool, như False, None, 0, [],(), {}, '', có thể là những người khác.

Bạn có thể sử dụng locals().get('mightnotexist') hoặc globals().get('mightnotexist'), tùy thuộc vào việc biến được dự kiến ​​là cục bộ hay toàn cầu, để tham chiếu biến có thể không tồn tại. Chúng sẽ trả về None nếu biến không tồn tại.

Mã của bạn có thể trở thành:..

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

Tôi thích giải pháp này bởi vì nó ở trong ý kiến ​​của tôi dễ đọc hơn. –

Các vấn đề liên quan