相关疑难解决方法(0)

断言整数在范围内

我正在python中编写一些单元测试,测试是否收到整数.然而,有时这个整数可以关闭1或2,我真的不在乎.基本上我希望能够断言收到的整数在一定范围内,如:

self.assertBetween(998, 1000, my_integer)
Run Code Online (Sandbox Code Playgroud)

这是否有可接受的方式?或者我必须做这样的事情:

self.assertTrue(998 <= my_integer)
self.assertTrue(my_integer <= 1000)
Run Code Online (Sandbox Code Playgroud)

编辑 到目前为止的答案建议:

self.assertTrue(998 <= my_integer <= 1000)
Run Code Online (Sandbox Code Playgroud)

在我的2个断言的例子中,这有什么好处吗?

python unit-testing python-2.7 python-unittest

15
推荐指数
3
解决办法
1万
查看次数

Python 3系列Vs Python 2系列

我最近开始学习python 3.
python 2中, range()函数可用于分配列表元素.

>>> A = []
>>> A = range(0,6)
>>> print A
[0, 1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

python 3中,当使用range()函数时,这种情况正在发生

>>> A = []
>>> A = range(0,6)
>>> print(A)
range(0, 6)
Run Code Online (Sandbox Code Playgroud)

为什么会这样?
为什么python会做这个改变?
这是恩惠还是祸根?

python list range

12
推荐指数
1
解决办法
2万
查看次数

Python:创建子列表而不复制

我有一个问题,如何创建一个子列表(我希望这是正确使用的术语)从给定的列表,而不是复制.

切片似乎可以创建子列表,但是可以通过复制来实现.这是一个例子.

In [1]: a = [1,2,3]

In [2]: id(a)
Out[2]: 4354651128

In [3]: b = a[0:2]

In [4]: b
Out[4]: [1, 2]

In [5]: id(b)
Out[5]: 4354621312

In [6]: id(a[0:2])
Out[6]: 4354620880
Run Code Online (Sandbox Code Playgroud)

在这里看到b的id和[0:2]是不同的,尽管它们的值是相同的.要仔细检查,更改a中的值,b中的值不会更改.

In [7]: a[1] = 4

In [8]: a
Out[8]: [1, 4, 3]

In [9]: b
Out[9]: [1, 2]
Run Code Online (Sandbox Code Playgroud)

所以回到我的问题,如何创建子列表但不复制?我的意思是,当a [1]的值设置为4时,b将为[1,4].

我四处搜索并没有找到太多帮助(也许我没有使用正确的关键字).谢谢!


编辑:

谢谢大家的意见和答案!这是我学到的.

  • Python中没有内置的方法来创建列表视图(或创建子列表而不复制).
  • 最简单的方法是使用numpy数组.
  • 虽然numpy数组与list相比对数据类型有限制,但它确实符合我的目的(实现没有额外内存的quicksort)

这是与numpy数组相同的过程.

In [1]: import numpy as np

In [2]: a = np.arange(1,4)

In [3]: a
Out[3]: array([1, 2, 3])

In …
Run Code Online (Sandbox Code Playgroud)

python

9
推荐指数
1
解决办法
3069
查看次数

Python范围生成器是否生成所有值或逐步生成它们?

当你做这样的事情:

for i in range(5):
      print i
Run Code Online (Sandbox Code Playgroud)

Python做什么?它首先使用[0,1,2,3,4]生成一个数组,然后遍历打印它的每个项目吗?相近:

for i in [0,1,2,3,4]:
  print i
Run Code Online (Sandbox Code Playgroud)

或者是否在生成它们时打印每个数字?就像是:

生成0将0分配给i打印i

生成1 - >将1分配给i - >打印i

生成2 - >将2分配给i - >打印i

生成3 - >将3分配给i - >打印i

生成4 - >将4分配给i - >打印i

更新

我添加了Python 2.7的标签.我不认为我的问题是版本特定的,但它似乎是!

现在我正在使用Python 2.7,所以我的问题就是这个.但我发现将Python 2范围与Python 3范围进行比较的信息非常有价值.

python python-2.7

8
推荐指数
1
解决办法
694
查看次数

评估 if x in range(n) **Python3** 的时间复杂度是多少

看来在 python 3 中评估的检查时间:

if x in range(n)

应该是 O(1),是吗?你能指点我一些文档吗?

(在 2.7 范围中是列表,因此时间复杂度肯定是线性的)

python time-complexity python-3.x

7
推荐指数
0
解决办法
309
查看次数

5
推荐指数
2
解决办法
320
查看次数

检查用户的IP地址是否在IP范围内

在我的 Python 应用程序中,我有一个 IP 地址字符串数组,如下所示:

[
    "50.28.85.81-140", // Matches any IP address that matches the first 3 octets, and has its final octet somewhere between 81 and 140
    "26.83.152.12-194" // Same idea: 26.83.152.12 would match, 26.83.152.120 would match, 26.83.152.195 would not match
]
Run Code Online (Sandbox Code Playgroud)

我安装了netaddr,虽然文档看起来很棒,但我无法理解它。这一定非常简单 - 如何检查给定的 IP 地址是否与这些范围之一匹配?不需要netaddr特别使用 - 任何简单的 Python 解决方案都可以。

python compare ip-address

5
推荐指数
1
解决办法
3357
查看次数

在列表理解中使用while循环

说我有一个功能:

x=[]
i=5
while i<=20:
     x.append(i)
     i=i+10
return x
Run Code Online (Sandbox Code Playgroud)

无论如何有这样将其转换为列表理解吗?

newList = [i=05 while i<=20 i=i+10]
Run Code Online (Sandbox Code Playgroud)

我收到语法错误

python list-comprehension list

5
推荐指数
2
解决办法
1万
查看次数

Python 3:如何在范围对象中查找比在列表中查找更快?

当我遇到在对象中查找的答案之一range是 CONSTANT TIME 操作时,我在 StackOverflow 上滚动浏览了许多与列表与范围相关的问题!这在 O(1) 中如何完成是没有意义的,您将不得不遍历范围以查看是否存在数字。范围对象是否像一些哈希图/字典一样工作?

def usingRange(x):
    return x in range(0, 100000000)
print(usingRange(9999999)) 


def noRange(x):
    return x in list(range(0, 100000000))
print(noRange(9999999))

%timeit usingRange(9999999)
%timeit noRange(9999999)
Run Code Online (Sandbox Code Playgroud)

我得到的输出为:

True
True
443 ns ± 8.83 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
6.89 s ± 380 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Run Code Online (Sandbox Code Playgroud)

我想知道为什么它的时间恒定的原因是因为

  1. 有人告诉我不要太专注于学习 Python 编程面试中的“技巧”!因为你所做的每一件事,你都必须解释时间复杂度,所以你要么记住i in list1O(N),要么使用 for 循环遍历列表:

    for …
    Run Code Online (Sandbox Code Playgroud)

python lookup list xrange python-3.x

5
推荐指数
0
解决办法
169
查看次数

索引范围对象时是否使用迭代协议?

由于range对象按需生成值,是否意味着无论何时索引范围,迭代协议都会被调用到该索引?

我的意思是:

>>> R = range(1,11)
>>> print(R[5])
6
Run Code Online (Sandbox Code Playgroud)

既然R[5]没有存储在内存中,是否每次都通过创建一个新的迭代器来计算?如果没有,如何索引范围对象?

python indexing python-3.x python-internals

5
推荐指数
1
解决办法
119
查看次数