2012-10-19 36 views
5

Nói rằng tôi có một danh sách như thế này:chuyển đổi danh sách các chuỗi và số chuỗi và nổi

a = ['hello','1','hi',2,'something','3'] 

Tôi muốn chuyển đổi các con số trong danh sách vào phao trong khi vẫn giữ chuỗi.

tôi đã viết này:

for i in a: 
    try: 
     i = float(i) 
    except ValueError: 
     pass 

Có cách nào hiệu quả hơn và gọn gàng để làm điều này?

+5

Các số liệu có luôn ở cùng vị trí không? –

Trả lời

1

Bạn đang thay đổi giá trị của biến i -> Nội dung của mảng a không thay đổi! Nếu bạn muốn thay đổi các giá trị trong mảng, bạn thay vì phải thực hiện nó như thế này:

for index, value in enumerate(a): 
    try : 
     a[index] = float(value) 
    except ValueError : 
     pass 
4

Dựa trên những gì bạn đã cố gắng:

a = ['hello', '1.0', 'hi', 2, 'blah blah', '3'] 

def float_or_string(item): 
    try: 
     return float(item) 
    except ValueError: 
     return item 


a = map(float_or_string, mylist) 

Nên làm các trick. Tôi muốn nói rằng một khối try:... except:... vừa hiệu quả vừa b) gọn gàng. Như halex chỉ ra, map() không thay đổi danh sách tại chỗ, nó sẽ trả về một danh sách mới và bạn đặt a bằng với nó.

1

Các thử/trừ cách là cách Pythonic để làm việc đó, nhưng nếu bạn thực sự ghét nó, xem nếu điều này phục vụ mục đích của bạn:

a = ['hello','1','hi',2,'something','3'] 

pattern = re.compile(r'^(-?\d+)(\.\d+)?') 

b = [float(item) if isinstance(item, str) and re.match(pattern, item) 
else item for item in a] 
+1

Regex? Có vẻ giống như giết gián với một khẩu súng ngắn :) –

+1

@ JoelCornett Haha, tôi nghĩ OP không thích cách thử/ngoại trừ việc làm điều này, vì vậy có thể tái tốt hơn cho anh ta. –

0

gì về ví dụ ngắn của tôi:

a = ['hello','1','hi',2,'something','3'] 

for i, item in enumerate(a): 
    if str(item).isdigit(): 
     a[i] = float(item) 

print a 
+1

Nó sẽ phá vỡ trên '" 1.0 "'. Tuy nhiên, không chắc chắn liệu OP có dự định có bất kỳ thứ gì trong số đó hay không. –

0

tôi nghĩ rằng đây là ngắn và cách tốt hơn:

a = ['hello','1','hi',2,'something','3'] 

for index,value in enumerate(a): 

    if isinstance(value,int): 

      a[index] = float(value) 

print a 

OUTPUT lÀ: [ 'hello', '1', 'hi', 2,0, 'cái gì', '3']

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