5 Chuyển đổi số nguyên sang float

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi đang cố gắng viết một hàm chuyển đổi số nguyên thành số float và để lại booleans và chuỗi như hiện tại.

Tôi đã xác định chức năng sau:

def if_int_to_float(value):

    if isinstance(value, bool):

        return value

    elif isinstance(value, int):

        return float(value)

    else:

        return value

Khi được sử dụng rộng rãi, tôi đã thấy chức năng này hơi chậm. Bất kỳ ý tưởng để cải thiện hiệu suất của nó /làm cho nó trở nên pythonic hơn?

    
0
  1. Ý bạn là gì khi bạn nói chậm?
    2019-05-08 15: 52: 25Z
  2. Câu hỏi: tại sao bạn cần chức năng này ngay từ đầu? Điều này có vẻ giống như một cái gì đó nếu bạn cần một chiếc phao, bạn chỉ có thể chuyển đến float() khi cần thiết.
    2019-05-08 15: 53: 20Z
  3. Bạn kiểm tra bool, tuy nhiên, bạn không làm gì đặc biệt nếu có, vì vậy bạn có thể xóa nó.
    2019-05-08 15: 55: 35Z
  4. Mã này được chạy như một phần của chương trình lớn hơn và sau khi chơi xung quanh với cProfile, tôi thấy rằng một phần tốt của thời gian thực hiện đã bị ăn hết bởi hàm này gọi mặc dù nó không được gọi quá nhiều.
    2019-05-08 18: 19: 46Z
5 Câu trả lời                              5                         

Bạn có thể kết hợp nếu điều kiện của bạn. Điều này sẽ giúp vì chúng tôi ngắn mạch các điều kiện nếu dựa trên các đầu vào, do đó có thể làm cho mã của bạn nhanh hơn!

def if_int_to_float(value):

    #If not boolean and int or float, convert to float
    if not isinstance(value, bool) and isinstance(value, int) or isinstance(value,float):
        return float(value)

    #Else return value
    else:
        return value

print(if_int_to_float('a'))
print(if_int_to_float(1))
print(if_int_to_float(1.0))
print(if_int_to_float(True))

Đầu ra sẽ là

a
1.0
1.0
True
    
1
2019-05-08 16: 38: 49Z
  1. Nó hoạt động, cảm ơn nhưng giải pháp của Fuzzbury nhanh hơn!
    2019-05-08 18: 24: 40Z
  2. Chắc chắn, tôi có thể biết bạn đánh giá nó nhanh hơn như thế nào không? Ngoài ra sử dụng loại là xấu và thậm chí các tài liệu đề nghị sử dụng isinstance
    2019-05-09 02: 19: 30Z
  3. Cảm ơn Devesh, chỉ chạy cProfile chống lại mã của tôi với chức năng mới. Tuy nhiên, sau khi đọc thêm về type, tôi đã chọn giải pháp của bạn.
    2019-05-09 06: 28: 01Z
  4. Chắc chắn cảm ơn, giải pháp được chọn trước đó đã sử dụng phép nhân không cần thiết trong mã, trong khi chỉ cần xâu chuỗi ifinstance là đủ :)
    2019-05-09 06: 29: 27Z

Bạn có thể xóa một kiểm tra và viết trên một dòng để cải thiện tốc độ một chút khi chuyển phao hoặc chuỗi. Trường hợp bool đã rất nhanh.

Isinstance () đang gây ra cho bạn một số rắc rối ở đây vì các bool cũng khớp với int do đó là câu lệnh if đầu tiên của bạn, vì vậy bạn có thể sử dụng loại () thay vì

def if_int_to_float(value):
    return value * 1.0 if type(value) == int else value
    
3
2019-05-08 16: 07: 00Z
  1. Điều này hoạt động như một bùa mê và làm cho mã của tôi nhanh hơn. Cảm ơn bạn!
    2019-05-08 18: 21: 26Z
  2. Nếu tôi có thể hỏi, làm sao bạn biết @NicolasBerthier rằng điều này nhanh hơn? Ngoài ra, sử dụng type là không tốt và bạn luôn phải sử dụng isinstance để kiểm tra các loại theo tài liệu python: docs.python.org/3/l Library /fiances.html # type
    2019-05-09 05: 24: 14Z
  3. Xin chào Devesh, chỉ bằng cách chạy mã của tôi thông qua cProfile và thay thế chức năng.
    2019-05-09 06: 28: 42Z

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

def if_int_to_float(value):

    if type(value) == int:

        return float(value)

    else:

        return value
    
2
2019-05-08 16: 01: 57Z
  1. Nó hoạt động, cảm ơn nhưng giải pháp của Fuzzbury nhanh hơn!
    2019-05-08 18: 23: 14Z

Có lẽ bạn có thể thử chức năng type() và nhận kết quả. Hoặc bạn có thể sử dụng xử lý ngoại lệ để xử lý loại vấn đề này. Nhưng trong trường hợp đó, như đã chỉ ra trong các bình luận, trong trường hợp bool, nó sẽ chuyển đổi True thành 1.0False thành 0600350991111001 0.0     

1
2019-05-08 16: 02: 11Z
  1. Điều này chuyển đổi boolean thành 1.0!
    2019-05-08 16: 01: 55Z
  2. cảm ơn vì đã chỉ ra nó.
    2019-05-08 16: 02: 45Z

khi có dữ liệu trong danh sách, hãy sử dụng

#using type() function
def if_int_to_float(value):
    if type(value) == int:
        return float(value)
    else:
        return value
lambda

đầu ra

data=[1,3,'j','oo']
sol = list(map(lambda x: float(x) if type(x)=='int' else x, data))
print(sol)

hoặc sử dụng chức năng để kiểm tra giá trị riêng lẻ

[1.0, 3.0, 'j', 'oo']
    
1
2019-05-08 16: 05: 14Z
  1. Cảm ơn giải pháp. Dữ liệu của tôi không có trong danh sách nhưng tôi sẽ giữ nó xung quanh nếu tôi cần.
    2019-05-08 18: 24: 09Z
def fun_int_to_float(value):
    if type(value)=='int':
        return float(value)
    return value
nguồn đặt đây