列表中的特定范围(python)

时间:2018-10-12 11:29:37

标签: python python-2.x

我有一个从文本字符串中提取的整数列表,因此当我打印列表(我称为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的数字。

6 个答案:

答案 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)

这是因为您正在将stringinteger进行比较,并且如果数字不超过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
  • 先将str转换为int,然后比较您的条件

答案 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,则打印该数字

我不会为您编写代码,但是在其他答案中您可以找到它