2017-04-07 38 views
0

列表元素我在蟒,看起來像這樣的輸入:隱蔽輸入到蟒

20.1 
25.9 
31.2 
33.2 
31.2 
25.5 
28.1 
23.2 
stop 

它是浮點數字的序列,每個在單獨的行。我希望遍歷它們或將它們轉換爲列表來迭代,但我找不到正確的方法來完成它。 到目前爲止,我已經試過這樣:

list = [float(n) for n in input().split('\n')] 

但它只返回我的第一個值。 我希望將所有值轉換爲列表並保持其完整性。

回答

0

輸入函數只讀取一行。您需要多次調用並檢查「停止」。

import sys 

mylist = [] 
for line in sys.stdin: 
    if line.startswith('stop'): 
     break 
    else: 
     mylist.append(float(line)) 

print(mylist) 

itertools.dropwhile可以爲你做一些工作。給它一個函數,當迭代應該停止時返回一個False值,加上一個序列,並且你可以在列表擴展中完成工作。

import sys 
import itertools 

def not_stop_condition(line): 
    """Return True unless a line with 'stop' is seen""" 
    return not line.startswith('stop') 

mylist = [float(line) for line in itertools.takewhile(
    not_stop_condition, sys.stdin)] 

print(mylist) 

,僅僅實現像not_stop_condition簡單表達的小的功能可以被放置在線路中一個lambda。 A lambda只是一個匿名函數 - 用任意數量的參數調用並返回表達式計算的任何值。

import sys 
import itertools 

mylist = [float(line) for line in itertools.takewhile(
    lambda line: not line.startswith('stop'), sys.stdin)] 
print(mylist) 
+0

使用其他空格(例如'''')來分隔它們的'input's會不會更容易? –

+0

@Chris_Rands - 我們不知道輸入來自哪裏。改變來源可能是不可能的。將行分隔的數據傳送到程序中是正常的,如果輸入變大,則它是更好的方法。考慮一個擁有1000萬浮點數的數據集。 – tdelaney

+0

謝謝,它真的有效,** lambda **函數是什麼? – Leonor