簡體   English   中英

列表理解替換非float或int的項

[英]List comprehension replacing items that are not float or int

我有一個2項目清單。

樣本輸入:

['19(1,B7)', '20(1,B8)']
['16 Hyp', '16 Hyp']
['< 3.2', '38.3302615548213']
['18.6086945477694', '121.561539536844']

我需要尋找任何不是浮點數或int的東西並將其刪除。 所以我需要上面的列表看起來像是:

['19(1,B7)', '20(1,B8)']
['16 Hyp', '16 Hyp']
['3.2', '38.3302615548213']
['18.6086945477694', '121.561539536844']

我寫了一些代碼來找到'>'並拆分第一個項目,但我不知道如何讓我的'新項目'取代舊項目:

這是我目前的代碼:

def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

for i in range(0,len(result_rows)):
    out_row = []
    for j in range(0,len(result_rows[i])-1):
        values = result_rows[i][j].split('+')
            for items in values:
                if '> ' in items:
                newItem=items.split()
                for numberOnly in newItem:
                   if is_number(numberOnly):
                      values.append(numberOnly)

這個(打印(值))的輸出是

['< 3.2', '38.3302615548213', '3.2']

這看起來更像是一個真正的列表理解方式來做你想要的......

def isfloat(string):
    try:
        float(string)
        return True
    except:
        return False

[float(item) for s in mylist for item in s.split() if isfloat(item)]
#[10000.0, 5398.38770002321]

或者刪除float()以將項目作為字符串。 只有在字符串中找到“>”或“<”時,才能使用此列表推導。

迭代器在這里工作得很好:

def numbers_only(l):
    for item in l:
        if '> ' in item:
            item = item.split()[1]
        try:
            yield float(item)
        except ValueError:
            pass
>>> values = ['> 10000', '5398.38770002321']
>>> list(numbers_only(values))
[10000.0, 5398.38770002321]

通常,創建新列表比迭代和修改舊列表更容易

關於什么

def stip_chars(lst):
    for item in lst:
        yield item.strip("> ")

new_values = [v for v in strip_chars(values) if is_number(v)]

如果要編輯列表而不是創建新列表,可以使用enumerate迭代它:

for (list_index, item) in enumerate(values):
    if '> ' in item:
        values[list_index] = ' '.join(item_part for item_part in item.split() if is_number(item_part))

或者你想構建你的新價值 - 如果原始列表中有'5 6',我不確定你想要什么。

如果您想要一個新列表,您可以使用列表推導執行類似的操作。

values = ['> 10000', '5398.38770002321']
print [filter(lambda s: s in '0123456789.', v) for v in values]

返回值:

['10000', '5398.38770002321']

根據要求提供字符串列表。

並使其成為一個功能:

def parse_number(value):
    return [filter(lambda s: s in '0123456789.', v) for v in values]

print parse_number(values)

作為額外的獎勵,使這個接受負數就像在白名單字符串'0123456789.-'添加連字符一樣簡單'0123456789.-'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM