2009-05-04 64 views

Trả lời

41
changed_list = [int(f) if f.isdigit() else f for f in original_list] 
+3

Một lớp lót trang nhã. Kìa sức mạnh của việc hiểu danh sách. – mkClark

+0

đã suy nghĩ về các dòng tương tự – Nope

+0

giải pháp tốt nhưng nếu danh sách có giá trị nổi cũng '['batting trung bình', '306', 'ERA', '1710.5']' –

5

Dữ liệu có vẻ như bạn biết vị trí của các số. Trong trường hợp này có lẽ tốt hơn để chuyển đổi một cách rõ ràng các dữ liệu tại các vị trí thay vì chỉ chuyển đổi bất cứ điều gì mà trông giống như một số:

ls = ['batting average', '306', 'ERA', '1710'] 
ls[1] = int(ls[1]) 
ls[3] = int(ls[3]) 
+0

Yep đây là giải pháp tốt nhất cho trường hợp tĩnh, trong khi Alex là tốt nhất cho trường hợp động. – Unknown

5

Hãy thử điều này:

def convert(someList): 
    for item in someList: 
     try: 
      yield int(item) 
     except ValueError: 
      yield item 

newList= list(convert(oldList)) 
0
a= ['batting average', '306', 'ERA', '1710.5'] 

[f if sum([c.isalpha() for c in f]) else float(f) for f in a ] 

nếu danh sách của bạn có chứa phao , string và int (như được chỉ bởi @ d.putto trong nhận xét)

+1

'tổng ([c.isalpha() cho c trong f])' là một cách tối ưu phụ để kiểm tra "nếu bất kỳ ký tự nào trong f là chữ cái" - hãy thử 'bất kỳ (c.isalpha() cho c trong f) 'để cải thiện khả năng đọc và hiệu suất. Tất nhiên, cả hai sẽ thất bại nếu 'f' bằng ví dụ' '!' '- một chuỗi không phải là số nhưng không có ký tự chữ và số - và cũng không chuyển đổi, ví dụ: '' 1,7e3'' - một chuỗi chứa một char chữ số nhưng vẫn hoàn toàn tốt để truyền làm đối số cho 'float' (" ký hiệu số mũ "). –

+0

đúng. điểm tốt ... đăng nó chỉ để trả lời ví dụ cụ thể của d.putto. Nên đã đặt trong suy nghĩ nhiều hơn trước khi gửi câu trả lời nửa nướng của tôi! –

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