0

我有一个 2 项目列表。

样本输入:

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

我需要寻找任何不是浮点数或整数的东西并将其删除。所以我需要上面的列表看起来像:

['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)

这个 (print(values)) 的输出是

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

5 回答 5

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()以将项目作为字符串。只有在字符串中找到 '>' 或 '<' 时,您才能使用此列表推导式。

于 2013-05-15T19:52:45.537 回答
0

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

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]

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

于 2013-05-15T19:24:33.907 回答
0

关于什么

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

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

?

于 2013-05-15T19:25:16.807 回答
0

如果您想就地编辑列表而不是创建新列表,可以使用以下方法对其进行迭代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”,我不确定您想要什么。

如果你想要一个新列表,你可以用列表推导做类似的事情。

于 2013-05-15T19:26:03.370 回答
0
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.-'

于 2013-05-15T19:42:42.920 回答