我有一个从文本字符串中提取的整数列表,因此当我打印列表(我称为test
)时,我得到:
['135', '2256', '1984', '3985', '1991', '1023', '1999']
,我想打印或制作一个仅包含特定范围内数字的新列表,例如在1000-2000之间。我尝试了以下操作,但仍返回原始列表中的所有项目。
for i in test:
if i>1000:
print i
elif i<2000:
print i
我不知道为什么仍然打印低于1000或高于2000的数字。
答案 0 :(得分:5)
首先将您的字符串列表转换为整数列表:
ints_list = [int(x) for x in test]
然后,您可以根据需要过滤此列表。我们可以像上一行那样通过列表理解来做到这一点。请注意,and
使得它必须满足两个条件才能在列表中出现。
filtered_list = [x for x in ints_list if x > 1000 and x < 2000]
答案 1 :(得分:1)
让我们首先说明,这不能可以在python 3下运行,因为您不能再将字符串(包含在列表中)与整数进行比较而不会出错了。
在python 2上,所有i>1000
测试均成功。
>>> "12">1000
True
幸运的是,此问题已在python 3中修复,并且避免了这些错误:
>>> "12">1000
Traceback (most recent call last):
File "<string>", line 301, in runcode
File "<interactive input>", line 1, in <module>
TypeError: unorderable types: str() > int()
我建议测试整数(如果您想将列表元素保留为字符串,请事先进行转换):
lst = ['135', '2256', '1984', '3985', '1991', '1023', '1999']
print([x for x in lst if 1000<int(x)<2000])
或先转换为整数,然后过滤:
lst = [int(x) for x in lst]
print([x for x in lst if 1000<x<2000])
使用链式比较,这种情况下可读性强。
答案 2 :(得分:1)
您使用的是Python 2还是3,这是模棱两可的。您标记了Python 3,但是在这种情况下,您应该得到TypeError
而不是语义上不正确的输出。此答案适用于两个版本的Python。
test
是一个字符串列表,但是您想进行整数比较。
首先构建一个整数列表,然后应用您的算法。
>>> test = ['135', '2256', '1984', '3985', '1991', '1023', '1999']
>>> test_ints = [int(x) for x in test] # or test_ints = map(int, test)
>>> for i in test_ints:
... if i > 1000:
... print(i)
... elif i < 2000:
... print(i)
...
135
2256
1984
3985
1991
1023
1999
现在代码可以运行,但是仍然存在错误。请注意135
是如何错误打印的,因为它不大于1000
但小于2000
。
无错误版本可能如下所示:
>>> for i in test_ints:
... if 1000 < i < 2000:
... print(i)
...
1984
1991
1023
1999
...,如果您想建立一个列表,而不只是打印过滤后的元素,请创建一个空列表并append
匹配。
>>> result = []
>>> for i in test_ints:
... if 1000 < i < 2000:
... result.append(i)
...
>>> result
[1984, 1991, 1023, 1999]
如果您已经对列表理解已经很熟悉,那么编写此代码的简短版本应如下所示:
>>> result = [i for i in test_ints if 1000 < i < 2000]
>>> result
[1984, 1991, 1023, 1999]
或者,可以通过将内置的int
映射到一次理解中的原始列表int
上,即时转换为test
。
>>> result = [i for i in map(int, test) if 1000 < i < 2000]
>>> result
[1984, 1991, 1023, 1999]
就个人而言,我更倾向于最后一种解决方案。
答案 3 :(得分:0)
这是因为您正在将string
与integer
进行比较,并且如果数字不超过1000
,例如第一个值:135
,则移至其中elif
<135
的{{1}}。
您可以尝试的是:
2000
假设您所有的值都是整数值。
答案 4 :(得分:0)
检查:
>>> l = ['135', '2256', '1984', '3985', '1991', '1023', '1999']
>>> for i in l:
if (int(i) > 1000) and (int(i) < 2000):
print i
答案 5 :(得分:0)
您当前面临两个问题:您的电话号码不是真正的integers
,而是strings
,并且if
条件不能按预期工作。
从integer
问题开始,您可以看到您正在处理strings
,该问题代表一个数字,方法是在for
循环开始时打印其类型:
for i in test:
print type(i) # string!
在python中,很容易将strings
转换为integers
:
i = int(i) # now 'i' is an integer
在这段代码中,python会尝试将字符串转换为整数,如果他不能这样做(即int("Hello World!")
),则会引发错误。
第二个问题是您的if
条件背后的逻辑,但是幸运的是Python确实类似于英语,因此我们可以轻松地将代码翻译成口头语言:
对于我列表中的每个号码,
如果数字大于1000,则打印数字
否则,如果数字小于2000,则打印数字
所以现在我们可以模拟一些情况:
我们的电话是1337
大于1000吗?是!所以-打印号码
或
我们的电话是42
大于1000吗?没有!继续
低于2000吗?是!打印号码
最后:
我们的电话是2048
大于1000吗?是!打印号码
所以现在问题似乎很清楚了。
您要转换为代码的english sentence
是:
对于我列表中的每个数字, 如果该数字大于1000 而该数字小于2000,则打印该数字
我不会为您编写代码,但是在其他答案中您可以找到它