2016-10-15 54 views
1

原諒我,提取多個浮點數,我是新來的Python。的Python:從字符串

鑑於與浮動不確定長度的開始,並以相同的結尾的字符串,如何可以提取兩者成一個陣列,或者如果只有一個浮子,只是一個。

例子:

"38.00,SALE ,15.20" 
"69.99" 

我想回:

[38.00, 15.20] 
[69.99] 
+0

這是相當不準確的:你的例子顯示「銷售」,你不會在你的問題中說什麼。你的輸入是什麼樣的? – Julien

+0

是你的輸入總是逗號分隔 – jamylak

+0

需要更多的輸入示例 –

回答

2

您還可以使用正則表達式來做到這一點

import re 
s = "38.00,SALE ,15.20" 
p = re.compile(r'\d+\.\d+') # Compile a pattern to capture float values 
floats = [float(i) for i in p.findall(s)] # Convert strings to float 
print floats 

輸出:

[38.0, 15.2] 
+0

不要在python中使用正則表達式,當你有一個更可讀的替代方案。 –

+0

我同意,但它往往適用於字符串未正確定義並且有一點空閒形式的情況。另外,這個簡單的例子是學習OP是否已經不熟悉的好方法:) – sisanared

0

你可以嘗試像

the_string = "38.00,SALE ,15.20" 
floats = [] 
for possible_float in the_string.split(','): 
    try: 
     floats.append (float (possible_float.strip()) 
    except: 
     pass 
print floats 
+1

你不應該使用裸體除了子句 –

+0

還有關於這種情況「這裏是一個浮動:123.45,這裏是另一個:67.89」 – Julien

+0

@JulienBernu根據問題浮動只出現在字符串的開頭和結尾。 –

2
def extract_nums(text): 
    for item in text.split(','): 
     try: 
      yield float(item) 
     except ValueError: 
      pass 

print list(extract_nums("38.00,SALE ,15.20")) 
print list(extract_nums("69.99")) 

[38.0, 15.2] 
[69.99] 

但是通過使用float轉換你losing precision,如果你想保持精度,您可以使用decimal

import decimal 

def extract_nums(text): 
    for item in text.split(','): 
     try: 
      yield decimal.Decimal(item) 
     except decimal.InvalidOperation: 
      pass 

print list(extract_nums("38.00,SALE ,15.20")) 
print list(extract_nums("69.99")) 

[Decimal('38.00'), Decimal('15.20')] 
[Decimal('69.99')] 
+0

我會說使用'csv'是矯枉過正的抓取一個已知位置在一個字符串中的浮游物。 –

+0

@machineyearning我從來沒有使用'csv',你看到我在哪裏使用它?你在閱讀我的想法嗎? – jamylak

+0

哦,很奇怪,我想我沒有仔細閱讀你的答案,但是第一個代碼片段以'import csv' haha​​haha開​​頭。 –

0

嘗試列表理解:

just_floats = [i for i in your_list.split(',') if i.count('.') == 1] 

首先將逗號分隔的字符串,然後通過s進行過濾特林和擺脫沒有小數位

+0

並非所有包含句點的字符串都是浮點數。 –

1

你說你只是在開始和結束的字符串彩車感興趣,所以假設它的值是逗號分隔:

items = the_string.split(',') 
try: 
    first = float(items[0]) 
except (ValueError, IndexError): 
    pass 
try: 
    second = float(items[-1]) 
except (ValueError, IndexError): 
    pass 

我們必須包裝在異常處理程序的操作,因爲值可能不是有效的float(ValueError)或指數在list(一IndexError)可能不存在。

這將處理所有的情況下,包括如果浮子的一個或兩個被省略。

0
import re  
map(float, filter(lambda x: re.match("\s*\d+.?\d+\s*", x) , input.split(",")) 

輸入:input = '38.00,SALE ,15.20'輸出:[38.0, 15.2]

輸入:input = '38.00,SALE ,15.20, 15, 34.'輸出:[38.0, 15.2, 15.0, 34.0]

說明:

  1. 想法是分割字符串:上,
  2. 然後使用正則表達式過濾字符串,其是實數list_to_filter = input.split(",")分裂:filtered_list = filter(<lambda>, list_to_filter),這裏項被包括在濾波器的輸出,如果LAMDA表達式爲真。所以當re.match("\s*\d+.?\d+\s*", x)匹配字符串x過濾器保持它。
  3. 最後轉換成浮動。 map(float, filtered_list)。它所做的是適用float()功能列表
+0

這真的很難閱讀和unpythonic。沒有理由把它全部放在一行上。特別是因爲OP說他是python的新手,所以你應該努力讓你的答案易讀易懂。 –

+0

是的,我同意,爲清晰起見添加了解釋。由於他是新人,這一行可能會讓他接觸到新的概念:) – bits

0

拆分輸入的每一個元素時,檢查期間被刪除,轉換成浮動,如果它是每個元素都是數字。

def to_float(input): 
    return [float(x) for x in input.split(",") if unicode(x).replace(".", "").isdecimal()]