For loops to Idiomatic Python



目标

这个程序在一个for循环中有一些算术计算。我正在寻找一个更好的惯用方法来解决这个问题。例如,如果我能用紧凑的列表理解或比列表理解更好的东西来做这件事?

import random
def diff_avg(first, second):
s = set()
len1 = len(first)
len2 = len(second)
if len1 == len2:
for i in range(len1-1):
n = first[i+1] - first[i]
p = second[i+1] - second[i]
k = p//n
v = p%n
s.add(k + v)

len3 = len(s)
if(len3 < len1):
return F"Non-Unique value(s) = {len1 - len3}"
else:
return F"Celebrate: https://youtu.be/2uMNtOQOaLU"
print("n------------------------------------------------------------------n")
first2= random.sample(range(10), k=6)
second2 =  [x*random.randrange(7) for x in first2]
print(F"List-1: {first2}")
print(F"List-2: {second2}")
print(F"{diff_avg(first2, second2)}")

对关联列表执行操作的一种方便方法是zip函数。这也适用于对列表和该列表的较小部分的操作,类似于您通过迭代索引对所做的操作:

>>> a = [1, 2, 3, 4]
>>> [(x, y) for x, y in zip(a, a[1:])]
[(1, 2), (2, 3), (3, 4)]

通常,使用CCD_ 2循环直接迭代集合的元素比迭代其CCD_ 4的CCD_;惯用的";执行此操作IMO的方法是使用zip来定义nd的生成器,然后依次将它们压缩在一起以生成结果:

def stats100(sqft, price):
if len(sqft) != len(price):
raise ValueError("Both arguments should be lists of exact same size")
return [
n / d for n, d in zip(
(p1 - p0 for p0, p1 in zip(price, price[1:])),
(a1 - a0 for a0, a1 in zip(sqft, sqft[1:]))
)
]

正如另一位评论者所指出的,打印一个错误并返回None绝对不是惯用的;相反,当函数不能返回它应该返回的值时,应该将raise作为一个异常。这样,调用代码就可以选择用except捕获它,并执行除简单打印消息之外的其他操作。

一种方法是使用列表理解:

return [(price[i + 1] - price[i]) / (sqft[i + 1] - sqft[i]) for i in range(l1 - 1)]

遍历元素而不是索引更容易"Pythonic";方法在这种情况下,您想要操作两个连续的元素,这通常是使用zip((将列表与自身的偏移量组合起来完成的:

s = [1700, 2100, 1900, 1300, 1600, 2200]
p = [53000, 65000, 59000, 41000, 50000, 68000]
r = [ (p1-p0)/(s1-s0) for s0,s1,p0,p1 in zip(s,s[1:],p,p[1:]) ]
print(r) # [30.0, 30.0, 30.0, 30.0, 30.0]

最新更新