列表中的特定范围 (python)

Specific range within a list (python)

我有一个从文本字符串中提取的整数列表,所以当我打印列表(我称之为 test)时,我得到:

['135', '2256', '1984', '3985', '1991', '1023', '1999']

并且我想打印或制作一个仅包含特定范围内数字的新列表,例如在 1000-2000 之间。我尝试了以下方法,但它仍然 returns 我原始列表中的所有项目。

for i in test:
    if i>1000:
        print i
    elif i<2000:
        print i

而且我不明白为什么它仍然打印低于 1000 或高于 2000 的数字。

那是因为您正在比较 stringinteger,如果数字不超过 1000,例如第一个值:135,如果移动到 elif 其中 135 < 2000.

您可以尝试的是:

for i in test:
    if 1000 < int(i) < 2000:
        print i

假设您的所有值都是整数值。

首先将您的字符串列表转换为整数列表:

ints_list = [int(x) for x in test]

然后您可以根据需要过滤此列表。我们可以用像上面一行那样的列表理解来做到这一点。请注意 and 使得该数字必须满足两个条件才能出现在列表中。

filtered_list = [x for x in ints_list if x > 1000 and x < 2000]

检查这个:

>>> l = ['135', '2256', '1984', '3985', '1991', '1023', '1999']

>>> for i in l:
     if (int(i) > 1000) and (int(i) <  2000):
         print i
  • 首先将 str 转换为 int,然后比较您的条件

让我们首先说明 不能 运行 under 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])

使用链式比较,在这种情况下非常可读。

使用 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]

就个人而言,我更喜欢最后一种解决方案,因为它简洁。

您目前面临两个问题:您的号码并不是真正的 integers,而是 strings,并且 if 条件未按您预期的那样工作。

integer 问题开始,您可以看到您正在处理 strings,它通过在 for 循环开始时打印其类型来表示一个数字:

for i in test:
    print type(i) # string!

in python 很容易将 strings 转换为 integers:

i = int(i) # now 'i' is an integer

在这段代码中,python 将尝试将字符串转换为整数,如果不能(即 int("Hello World!")),则会引发错误。

第二个问题是你的 if 条件背后的逻辑,但幸运的是 Python 真的很像英语,所以我们可以很容易地将我们的代码翻译成口语:

for each number in my list,
if the number is higher than 1000, print the number
else if the number is lower than 2000, print the number

所以现在我们可以模拟一些情况:

our number is 1337
is the number higher than 1000? YES! so - print the number

our number is 42
is the number higher than 1000? NO! go on
is the number lower than 2000? YES! print the number

最后:

our number is 2048
is the number higher than 1000? YES! print the number

所以现在问题似乎很清楚了。
您要转换为代码的 english sentence 是:

for each number in my list, if the number is higher than 1000 and the number is lower than 2000, print the number

我不会给你写代码,但你可以在其他答案中找到它