Python List Comprehensions试试

时间:2013-09-05 16:33:53

标签: python list-comprehension

我有一个如下所示的列表:

target = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '...', '1458', 'Next']

我想知道,是否有一个单行列表解析解决方案来找到列表中的最高数字:

我试过了:

max([int(num) for num in text])

...但似乎有些文字无法转换,除了列表理解之外没有尝试。

我只能接受一线解决方案,请

我的代码:

text = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '...', '1458', 'Next']
print text
max = 0
for num in text:
    try:
        if int(num) > max:
            max = int(num)
    except:
        pass
print max

1 个答案:

答案 0 :(得分:13)

您可以使用str.isdigit()来测试字符串是否可以转换:

max(int(num) for num in text if num.isdigit())

这里的生成器表达式就足够了,不需要创建中间列表。

演示:

>>> text = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '...', '1458', 'Next']
>>> max(int(num) for num in text if num.isdigit())
1458

注意int()也容忍空格;如果你怀疑你的输入列表在数字周围有空格,你可以添加一个str.strip()调用来扩大网络:

max(int(num) for num in text if num.strip().isdigit())

如果您还需要支持签名值(初始-+),您可以尝试:

max(int(num) for num in text if num.strip().lstrip('-+').isdigit() and num.count('-') + num.count('+') <= 1)

进行更详尽的测试。 int()仍然有点宽容,但对于大多数情况来说,这已经足够接近了;如果你想捕捉每一种可能性,你必须求助于正则表达式。

演示:

>>> text = [' +2 ', '-3', '     4', '5    ', '6', '7', '8', '9', '10', '...', '  +1458  ', 'Next']
>>> max(int(num) for num in text if num.strip().lstrip('-+').isdigit() and num.count('-') + num.count('+') <= 1)
1458