2013-02-13 34 views
13

Tôi muốn nối thêm một số biến vào danh sách. Số lượng biến khác nhau. Tất cả các biến bắt đầu bằng "volume". Tôi đã suy nghĩ có thể là một ký tự đại diện hoặc một cái gì đó sẽ làm điều đó. Nhưng tôi không thể tìm thấy bất cứ điều gì như thế này. Bất kỳ ý tưởng làm thế nào để giải quyết điều này? Lưu ý trong ví dụ này nó là ba biến, nhưng nó cũng có thể là năm hoặc sáu hoặc bất cứ điều gì.Nối nhiều biến vào danh sách trong Python

volumeA = 100 
volumeB = 20 
volumeC = 10 

vol = [] 

vol.append(volume*) 
+1

Nó có thể giúp đỡ nếu bạn có thể cho một ví dụ đó là gần gũi hơn với tình hình của bạn. Tức là, làm cách nào bạn kết thúc với một số biến số có tên không được biết? –

Trả lời

13

Bạn có thể sử dụng extend để thêm bất kỳ iterable vào một danh sách:

vol.extend((volumeA, volumeB, volumeC)) 

Tùy thuộc vào tiền tố của tên biến của bạn đã mã mùi hôi cho tôi, nhưng bạn có thể làm điều đó. (Thứ tự mà giá trị được nối là không xác định.)

vol.extend(value for name, value in locals().items() if name.startswith('volume')) 

Nếu trật tự là rất quan trọng (IMHO, vẫn có mùi sai):

vol.extend(value for name, value in sorted(locals().items(), key=lambda item: item[0]) if name.startswith('volume')) 
4

Mặc dù bạn có thể làm

vol = [] 
vol += [val for name, val in globals().items() if name.startswith('volume')] 
# replace globals() with locals() if this is in a function 

một cách tiếp cận tốt hơn sẽ được sử dụng một cuốn từ điển thay vì biến tương tự tên:

volume = { 
    'A': 100, 
    'B': 20, 
    'C': 10 
} 

vol = [] 
vol += volume.values() 

Lưu ý rằng trong trường hợp thứ hai thứ tự các mục không được chỉ định, đó là bạn có thể nhận được [100,10,20] hoặc [10,20,100]. Để thêm các mục trong một trật tự của phím, sử dụng:

vol += [volume[key] for key in sorted(volume)] 
+1

+1; nếu bạn có một loạt các biến có tên trong một số loại trình tự, bạn gần như chắc chắn làm sai. – geoffspear

+1

Các biến kết quả từ các phép tính khác (mà tôi không đăng ở đây). Nếu tôi sử dụng từ điển tôi có vấn đề trước tiên hãy đặt chúng vào một từ điển. – ustroetz

3

EDIT loại bỏ ra khỏi danh sách filter hiểu vì nó được nhấn mạnh rằng đó là một ý tưởng kinh khủng.

Tôi đã thay đổi nó để nó không quá giống với tất cả các câu trả lời khác.

volumeA = 100 
volumeB = 20 
volumeC = 10 

lst = map(lambda x : x[1], filter(lambda x : x[0].startswith('volume'), globals().items())) 
print lst 

Output

[100, 10, 20] 
+3

một cuộc gọi lọc bên trong một hiểu làm cho tôi buồn ... – JBernardo

+0

bình luận của bạn làm cho tôi nhận ra tôi đã sai lầm như thế nào: D - Nụ cười ngày mai là ngày Valentine. – sotapme

+0

Thậm chí còn xấu hơn khi chuyển sang sử dụng 'bản đồ' chỉ để tiếp tục sử dụng' bộ lọc'. Tôi nghĩ điểm của JBernardo là sự hiểu biết đã có sẵn một mệnh đề if tùy chọn, vì vậy hãy sử dụng nó thay vì 'filter'. –

0

làm bạn muốn thêm tên của các biến cũng như giá trị của họ?

output=[] 

output.append([(k,v) for k,v in globals().items() if k.startswith('volume')]) 

hay chỉ là giá trị:

output.append([v for k,v in globals().items() if k.startswith('volume')]) 
Các vấn đề liên quan