2016-02-11 326 views
1

我正在使用Python v2.x Windows 64位。 問題是,我想從列表中提取一個數字(102),但我只能得到if的一部分。從Python列表中提取數字

這裏是一個列表:

data = ['getmotors \r', 'Parameter,Value\r', 'Brush_RPM,0\r', 'Brush_mA,0\r', 'Vacuum_RPM,0\r', 'Vacuum_mA,0\r', 'LeftWheel_RPM,1800\r', 'LeftWheel_Load%,42\r', 'LeftWheel_PositionInMM,10452\r', 'LeftWheel_Speed,102\r', 'RightWheel_RPM,1800\r', 'RightWheel_Load%,42\r', 'RightWheel_PositionInMM,9650\r', 'RightWheel_Speed,102\r', 'ROTATION_SPEED,0.00\r', 'SideBrush_mA,0\r', '\x1a'] 

如何提取LeftWheel_Speed(102)的速度? 我試過data[9][-2],但是我得到的是'2'而不是'102'。

+0

數據如何[9] [ - 4:-1]? –

+0

@GarrettR這會失敗的其他人。 –

+1

'float(data [9] .strip()。split(',')[1])'除了前兩個元素外無處不在,因爲它們沒有值。使用'strip'去除'\ r' –

回答

1

在列表中的索引9處元素是字符串'LeftWheel_Speed,102\r',[-1]將顯示'\r'字符,因此[-2]將顯示2。 python中的字符串是列表類型,因此您正在查看倒數第二個字符。你需要分割字符串像每個數據元素:

data[9].split(',')[1] 

其中第一分割串入的逗號和打印102 2串,但要注意它仍包含您可能想要刪除\r字符:

data[9].split(',')[1][:-1] 

[:-1]將切掉字符串的最後一個字符(這是一個列表,以便你可以做列表分片)

編輯:如下評論,'102\r'.strip()會一個更完整的答案去除特殊字符,因爲它會將它們全部刪除

+0

'\ r'可以使用'strip'。 –

+0

你是對的讓我補充一點,謝謝 – user2255757

+0

'str.strip'。不是'string.strip'。 :-) –

2

使用re.search和正則表達式模式,可以從字符串中提取整數值。

>>> import re 
>>> 
>>> re.search(r'\d+', data[9]) 
<_sre.SRE_Match object; span=(16, 19), match='102'> 
>>> re.search(r'\d+', data[9]).group(0) 
'102' 
>>> speed = int(re.search(r'\d+', data[9]).group(0)) 
>>> speed 
102 

這裏,re.search(r'\d+', data[9])將返回匹配如果數據[9]具有任何十進制字符。然後使用.group(0)並最終將其轉換爲整數檢索此十進制字符,使用int()內置方法

2
>>> int(data[9][-4:-1])+1 
103 

使用iterable[start:end]讓他們的子集。

你可以做的另一件事是,如果你想從一個字符串獲得一個整數,是沿東西線(python2.x):

s = "test123\n" 
x = int(filter(lambda x: x.isdigit(), s)) 

在Python3,過濾器返回一個filter object這是一個可迭代的。您可以將它變成一個列表並加入它們以獲得相同的功能結果。

s = "test123\n" 
x = int(''.join(list(filter(lambda x: x.isdigit(), s)))) 

請注意,這不考慮分離的數字。例如,s = "123test456"將返回123456。如果你想讓它們分開,你需要使用更巧妙的東西。

>>> s = "\n123test456\n" 
>>> nums = map(int, ''.join([x if x.isdigit() else ' ' for x in s]).split()) 
>>> print(nums) 
[123, 456] 

再次,在python3,地圖返回map object,所以你只要將它轉化成一個列表。

>>> s = "\n123test456\n" 
>>> nums = list(map(int, ''.join([x if x.isdigit() else ' ' for x in s]).split())) 
>>> print(nums) 
[123, 456] 
+0

爲什麼'+ 1'? –

+0

沒有特別的原因。真的只是爲了表明它已經成功解析爲一個int,因此可以用於算術函數。 – Goodies

+0

+1,因爲這是解決問題的唯一答案,並解決了根本原因:提問者完全無視python中的切片列表。他不需要字符串函數或正則表達式,他需要用Dive Into Python度過一個下午。 – nortally

1
print data[9].split(',')[1] 

您可以拆分它「」並顯示在第二個字符串

+0

您的代碼格式出錯了。請參閱[Markdown幫助 - 代碼和預格式化文本](http://stackoverflow.com/editing-help#code)和[編輯]您的文章。 –

2

如果所有在列表中包含單個,可以被視爲鍵值對的項目,您可以打開將數據轉換成字典。這可以很容易地訪問您感興趣的值。

datadict = {} 
for item in data: 
    key_value = item.strip().split(',') 
    if len(key_value) == 2: 
     key, value = key_value 
     datadict[key] = value 
print(datadict['RightWheel_Speed']) # 102 
+0

謝謝你的回答。我運行你的代碼,但是,我們得到一個錯誤「list」對象沒有屬性「strip」。 (是的,數據是一個列表) –

+0

我犯了一個錯誤。它應該是item.strip()。我已經解決了答案。 –