Python for带有if条件的循环(字典更新)



我是Python的新手,需要一些关于for循环和if条件的帮助。基本上,在下面的代码中,我试图找出kWh和天数的组合,这将导致方程的输出小于或等于40。

代码产生了输出,但不准确。例如,在输出中,我应该看到一个24天1千瓦时(24:1(的条目,但输出是有限的。

如有任何帮助,将不胜感激

slice = dict()
days = range(1, 110, 1)
kwh = range(1, 5001, 1)
for (d, k) in zip(days, kwh):
if 24 <= d <= 40 and (0.3856 * (k) + 6) <= 40:
slice.update({d: k})
print(slice)

电流输出:

{24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 34, 35: 35, 36: 36, 37: 37, 38: 38, 39: 39, 40: 40}

不完整的结果有两个原因:

  1. 正如Konrads所提到的,zip从两个列表中获取每个元素,而不是返回它们的组合,即list(zip(days, kwh)=[(1, 1), (2, 2), (3, 3), ...]。正如Konrads所展示的,这可以通过嵌套循环来解决
  2. 作为密钥,days在字典中只能有一对key: values。记录将更新并替换。当你得到24: 24时,你永远不会得到24:1

对于问题2,将字典的样式重新格式化为days:[the list of satisfied kwh]将有所帮助:

slice = dict()
days = range(1, 110, 1)
kwh = range(1, 5001, 1)
for d in days:
if 24 <= d <= 40:
records = []
for k in kwh:
if (0.3856 * (k) + 6) <= 40:
records.append(k)
slice.update({d: records})
print(slice)

PS。由于您是Python的新手,我建议您尝试在IDE中使用调试器,如PyCharm。它将显示在cetrain步骤之后每个变量中存储的内容,因此您更容易发现zip和丢失旧记录的问题。

In [32]: import itertools
In [38]: from collections import defaultdict
In [35]: days = range(1, 110, 1)
...: kwh = range(1, 5001, 1)
In [36]: slice = defaultdict(list)
In [37]: for d,k in itertools.product(days,kwh):
...:     if 24 <= d <=40 and(0.3856*(k)+6) <= 40:
...:         slice[d].append(k)

Zip为list1和list2中的每一个创建映射。它不会给你2个列表的叉积,并且条件可以满足更多的值

zip从每个列表中获取一个元素并返回一个元组,这样你就得到了元组(1,1(,(2,2(等等。我想你想要的是一个嵌套的for循环:
for d in range(1,110):
for k in range(1,5001):
...

最新更新