原諒我,提取多個浮點數,我是新來的Python。的Python:從字符串
鑑於與浮動不確定長度的開始,並以相同的結尾的字符串,如何可以提取兩者成一個陣列,或者如果只有一個浮子,只是一個。
例子:
"38.00,SALE ,15.20"
"69.99"
我想回:
[38.00, 15.20]
[69.99]
原諒我,提取多個浮點數,我是新來的Python。的Python:從字符串
鑑於與浮動不確定長度的開始,並以相同的結尾的字符串,如何可以提取兩者成一個陣列,或者如果只有一個浮子,只是一個。
例子:
"38.00,SALE ,15.20"
"69.99"
我想回:
[38.00, 15.20]
[69.99]
您還可以使用正則表達式來做到這一點
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]
不要在python中使用正則表達式,當你有一個更可讀的替代方案。 –
我同意,但它往往適用於字符串未正確定義並且有一點空閒形式的情況。另外,這個簡單的例子是學習OP是否已經不熟悉的好方法:) – sisanared
你可以嘗試像
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
你不應該使用裸體除了子句 –
還有關於這種情況「這裏是一個浮動:123.45,這裏是另一個:67.89」 – Julien
@JulienBernu根據問題浮動只出現在字符串的開頭和結尾。 –
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')]
我會說使用'csv'是矯枉過正的抓取一個已知位置在一個字符串中的浮游物。 –
@machineyearning我從來沒有使用'csv',你看到我在哪裏使用它?你在閱讀我的想法嗎? – jamylak
哦,很奇怪,我想我沒有仔細閱讀你的答案,但是第一個代碼片段以'import csv' hahahaha開頭。 –
嘗試列表理解:
just_floats = [i for i in your_list.split(',') if i.count('.') == 1]
首先將逗號分隔的字符串,然後通過s進行過濾特林和擺脫沒有小數位
並非所有包含句點的字符串都是浮點數。 –
你說你只是在開始和結束的字符串彩車感興趣,所以假設它的值是逗號分隔:
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
)可能不存在。
這將處理所有的情況下,包括如果浮子的一個或兩個被省略。
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]
說明:
,
list_to_filter = input.split(",")
分裂:filtered_list = filter(<lambda>, list_to_filter)
,這裏項被包括在濾波器的輸出,如果LAMDA表達式爲真。所以當re.match("\s*\d+.?\d+\s*", x)
匹配字符串x
過濾器保持它。map(float, filtered_list)
。它所做的是適用float()
功能列表這真的很難閱讀和unpythonic。沒有理由把它全部放在一行上。特別是因爲OP說他是python的新手,所以你應該努力讓你的答案易讀易懂。 –
是的,我同意,爲清晰起見添加了解釋。由於他是新人,這一行可能會讓他接觸到新的概念:) – bits
拆分輸入的每一個元素時,檢查期間被刪除,轉換成浮動,如果它是每個元素都是數字。
def to_float(input):
return [float(x) for x in input.split(",") if unicode(x).replace(".", "").isdecimal()]
這是相當不準確的:你的例子顯示「銷售」,你不會在你的問題中說什麼。你的輸入是什麼樣的? – Julien
是你的輸入總是逗號分隔 – jamylak
需要更多的輸入示例 –