【问题标题】:defining a new variable equal to the length of two other arrays定义一个等于其他两个数组长度的新变量
【发布时间】:2020-09-05 07:58:26
【问题描述】:

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

给定两个列表:

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) 继续我的生活。

【问题讨论】:

  • 如果您确定 x 和 y 的长度相等,那么您绝对可以使用 n = len(x)len(y)。做 zip 和资产是矫枉过正
  • 你想做什么?
  • 因为您确实有工作代码,但想要一个替代解决方案Code Review 可能是这个问题的更好地方。
  • @das-g 谢谢,从未使用过代码审查。我应该只发一个新帖子还是有办法转移这个?
  • 如果列表 must 始终具有相同的长度(可能是因为两个列表中相同索引处的条目以某种方式一起使用),您可以使用单个列表来存放条目是列表/元组,在两个列表中的同一索引处具有您想要的值。那么只有一个列表的长度为:-) 例如xylist = [ [1,128],[2,244],[3,132],[4,261]] 并使用’len(xylist)

标签: python


【解决方案1】:

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

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

如果您怀疑它们可能不相等,并且想要在它们不相等时引发异常,那么您应该考虑最合适的异常。使用assert 是为了帮助调试,所以你的代码应该只在它实际上包含错误的情况下引发AssertionError。因此,如果您的代码应该创建具有相同长度的 xy 但您想检查它是否确实这样做了,那么您可以使用:

n = len(x)
assert n == len(y)

但是,如果 xy 派生自用户输入,并且用户可能错误地提供了长度不等的输入,那么这样做会更合适,例如:

n = len(x)
if n != len(y):
    raise ValueError('x and y should have equal lengths')

xy 中,以上都不是对称的,但在所有情况下,读者很明显这两个长度应该是相等的——并且在最后两个中是强制的.仅仅为了美观对称而使用len(list(zip(x, y))) 几乎没有任何理由,因为它在迭代两个输入和创建临时列表时增加了不必要的开销。更便宜(但仍然没有必要)的等价物是 min((len(x), len(y)))

当然,要考虑的另一件事是xy 必须始终具有相同的长度这一事实是否表明您的数据应该以不同的方式组织。例如,根据您打算如何使用数据,将数据存储为元组列表可能会更好——即您的 list(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 数组的情况下,您仍然可以通过创建相关切片来分别引用 xy(回想一下,在 numpy 中,切片是数据的视图而不是副本):

x = data[:,0]
y = data[:,1]

虽然这种方法当然依赖于它们具有相同的数据类型。

【讨论】:

    【解决方案2】:

    看起来很简单的案例: 你有 n1=len(x) 和 n2=len(y) 如果 n1 和 n2 始终相同,则可以使用这 2 个中的任何一个来声明 n n=n1n=n2

    如果它们可以不同,则取决于您需要获得这两个中的最小值 n=max(n1, n2)n=min(n1,n2) 在这些参数下不能有其他情况

    【讨论】:

      猜你喜欢
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多