Python 定义一个等于其他两个数组长度的新变量

Python 定义一个等于其他两个数组长度的新变量,python,Python,这纯粹是出于好奇,我肯定是想得太多了,但这是我偶尔碰到的事情,我从来都不喜欢我的解决方案 给出两个列表: x = [1, 2, 3, 4] y = [128, 244, 132, 161] 我需要计算一个新变量n,等于这些列表的长度。我可以使用n=len(x)或n=len(y),但这是明确地将n设置为一个,而不是另一个。我觉得以下是我想要的: def common_length(x, y): assert len(x) == len(y) return len(list(zip

这纯粹是出于好奇,我肯定是想得太多了,但这是我偶尔碰到的事情,我从来都不喜欢我的解决方案

给出两个列表:

x = [1, 2, 3, 4]
y = [128, 244, 132, 161]
我需要计算一个新变量
n
,等于这些列表的长度。我可以使用
n=len(x)
n=len(y)
,但这是明确地将
n
设置为一个,而不是另一个。我觉得以下是我想要的:

def common_length(x, y):
    assert len(x) == len(y)
    return len(list(zip(x, y)))

但这显然是矫枉过正。我不知道为什么这会让我感到困扰,但我想知道还有什么替代方案,如果有的话,或者我是否应该使用
n=len(x)

继续我的生活。情况看起来很简单: 有n1=len(x)和n2=len(y) 如果n1和n2始终相同,则可以使用这两个值中的任意一个来声明n
n=n1
n=n2

如果它们可以不同,这取决于您需要使用
n=max(n1,n2)
n=min(n1,n2)

在这些参数下不可能有其他情况

它看起来非常简单: 有n1=len(x)和n2=len(y) 如果n1和n2始终相同,则可以使用这两个值中的任意一个来声明n
n=n1
n=n2

如果它们可以不同,这取决于您需要使用
n=max(n1,n2)
n=min(n1,n2)

在这些参数下不可能有其他情况

如果您确定
x
y
具有相同的长度,但希望在代码中明确说明您可以选择其中一个(例如,为了将来的维护),那么您当然可以添加注释:

n = len(x)  # also equals len(y)

如果您怀疑它们可能不相等,并且如果不希望引发异常,那么您应该考虑什么异常最合适。使用

assert
是为了帮助调试,因此您的代码只应在实际包含bug的情况下引发
AssertionError
。因此,如果您的代码应该创建长度相等的
x
y
,但您希望检查它是否确实在这样做,那么您可以使用以下方法:

n = len(x)
assert n == len(y)
但是,如果
x
y
来自用户输入,并且用户可能错误地提供了长度不等的输入,则更适合这样做,例如:

n = len(x)
if n != len(y):
    raise ValueError('x and y should have equal lengths')
上述两种情况在看
x
y
时都不是对称的,但在所有情况下,读者都很清楚,这两种长度应该相等——在最后两种情况下,这是强制的。仅仅为了美观的对称性而使用
len(list(zip(x,y))
几乎没有理由,因为它在迭代输入和创建临时列表时增加了不必要的开销。更便宜(但仍然不必要)的等价物是
min((len(x),len(y))

当然,要考虑的另一件事情是,<>代码> x>代码>和<代码> y>代码>必须始终具有相同的长度,这表明数据应该被组织成不同的事实。例如,根据您打算如何使用数据,最好将数据存储为元组列表--即
列表(zip(x,y))
将生成什么:

data = [(1, 128), (2, 244), (3, 132), (4, 161)]
或者作为numpy阵列:

data = np.array([[1, 128], [2, 244], [3, 132], [4, 161]])
因此,您的声明变成:

n = len(data)
美学上的收获来自于以一种确保长度相等的约束不会被违反的方式实际组织数据的自然结果,而不是仅仅为了美学目的而设计出对称表达的结果

在numpy数组的情况下,您仍然可以通过创建相关切片来分别引用
x
y
(回想一下,在numpy中,切片是数据的视图,而不是副本):


虽然这种方法当然取决于它们是否具有相同的数据类型。

如果您确实知道
x
y
具有相同的长度,但希望在代码中明确说明(例如,为了将来的维护),您可以选择其中一种,那么您当然可以添加注释:

n = len(x)  # also equals len(y)

如果您怀疑它们可能不相等,并且如果不希望引发异常,那么您应该考虑什么异常最合适。使用

assert
是为了帮助调试,因此您的代码只应在实际包含bug的情况下引发
AssertionError
。因此,如果您的代码应该创建长度相等的
x
y
,但您希望检查它是否确实在这样做,那么您可以使用以下方法:

n = len(x)
assert n == len(y)
但是,如果
x
y
来自用户输入,并且用户可能错误地提供了长度不等的输入,则更适合这样做,例如:

n = len(x)
if n != len(y):
    raise ValueError('x and y should have equal lengths')
上述两种情况在看
x
y
时都不是对称的,但在所有情况下,读者都很清楚,这两种长度应该相等——在最后两种情况下,这是强制的。仅仅为了美观的对称性而使用
len(list(zip(x,y))
几乎没有理由,因为它在迭代输入和创建临时列表时增加了不必要的开销。更便宜(但仍然不必要)的等价物是
min((len(x),len(y))

当然,要考虑的另一件事情是,<>代码> x>代码>和<代码> y>代码>必须始终具有相同的长度,这表明数据应该被组织成不同的事实。例如,根据您打算如何使用数据,最好将数据存储为元组列表--即
列表(zip(x,y))
将生成什么:

data = [(1, 128), (2, 244), (3, 132), (4, 161)]
或者作为numpy阵列:

data = np.array([[1, 128], [2, 244], [3, 132], [4, 161]])
因此,您的声明变成:

n = len(data)
而美学上的增益则是一个n