我有一个如下所示的列表:
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
答案 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