在Python中生成列表时除以零
我试图将用户输入生成的百分比列表放入表中。该表正在工作,并具有来自e1-e24的输入。问题是有些输入为零,因此当程序遇到错误时会停止 以下是用户输入(由Tkinter生成): 第一列为e1-e12,第二列为e13-e24。因此,我用e1除以e13,沿着行进行除以 名单如下:在Python中生成列表时除以零,python,list,for-loop,divide-by-zero,Python,List,For Loop,Divide By Zero,我试图将用户输入生成的百分比列表放入表中。该表正在工作,并具有来自e1-e24的输入。问题是有些输入为零,因此当程序遇到错误时会停止 以下是用户输入(由Tkinter生成): 第一列为e1-e12,第二列为e13-e24。因此,我用e1除以e13,沿着行进行除以 名单如下: Percents= [("%.2f" % (int(e1.get())/int(e13.get()))), ("%.2f" % (int(e2.get())/int(e14.get()))),\ ("%.2f"
Percents= [("%.2f" % (int(e1.get())/int(e13.get()))), ("%.2f" % (int(e2.get())/int(e14.get()))),\
("%.2f" % (int(e3.get())/int(e15.get()))),("%.2f" % (int(e4.get())/int(e16.get()))),\
("%.2f" % (int(e5.get())/int(e17.get()))),("%.2f" % (int(e6.get())/int(e18.get()))),\
("%.2f" % (int(e7.get())/int(e19.get()))),("%.2f" % (int(e8.get())/int(e20.get()))),\
("%.2f" % (int(e9.get())/int(e21.get()))),("%.2f" % (int(e10.get())/int(e22.get()))),\
("%.2f" % (int(e11.get())/int(e23.get()))),("%.2f" % (int(e12.get())/int(e24.get())))]
但是,当它到达零时,它会被卡住。我尝试了
try:
和除了ZeroDivisionError:
之外,但由于它不可避免地会遇到错误,因此它不会存储百分比列表中的任何内容。我本来希望通过循环的方式列出这个列表,但是尝试e(I)与e1不同,所以我被这个问题所阻碍
for i in range(1, 12):
if 5 > i:
Percents.append("%.2f" % (int(e(i).get())/int(e(i+12).get())))
编辑:根据下面的答案,我尝试:
def calc_percent(foo,bar):
try:
return ("%.2f" % (int(foo.get())/int(bar.get())))
except ZeroDivisionError:
return "0"
Percents = [calc_percent(e1,e13),calc_percent(e2,e14)]
print Percents
我得到TclError:无效的命令名“.286005808”
因此,我将
Percents
和print Percents
放在def中,并获取TypeError:calc_percent()正好接受两个参数(给定0)
一种方法是预填充零:
百分比=[0]*12
然后,在可以插入的位置插入:
try:
Percents[x] = #stuff
...
一种方法是用零预填充: 百分比=[0]*12 然后,在可以插入的位置插入:
try:
Percents[x] = #stuff
...
最好创建两个条目列表(每列一个),然后执行以下操作:
my_list = [e_left.get() / e_right.get() for e_left, e_right in zip(left_entries_list, right_entries_list) if e_right.get() != 0 else y]
y
是您决定在正确值为0
的情况下使用的任何值
编辑:显然,您可以在列表理解中使用if
,但if…else
不起作用。因此,您可以使用map
。以下是一个简化的示例:
a = [1, 2, 3, 4]
b = [1, 1, 0, 1]
# -1 or other `default value` you wish to use
my_list = map(lambda x, y: x / y if y != 0 else -1, a, b)
print my_list
>> [1.0, 2.0, -1, 4.0]
最好创建两个条目列表(每列一个),然后执行以下操作:
my_list = [e_left.get() / e_right.get() for e_left, e_right in zip(left_entries_list, right_entries_list) if e_right.get() != 0 else y]
y
是您决定在正确值为0
的情况下使用的任何值
编辑:显然,您可以在列表理解中使用if
,但if…else
不起作用。因此,您可以使用map
。以下是一个简化的示例:
a = [1, 2, 3, 4]
b = [1, 1, 0, 1]
# -1 or other `default value` you wish to use
my_list = map(lambda x, y: x / y if y != 0 else -1, a, b)
print my_list
>> [1.0, 2.0, -1, 4.0]
解决这个问题的最简单方法是创建一个函数定义,为您进行计算,然后您可以在其中进行错误处理
def calc_percent(foo, bar):
try:
return "%.2f" % (int(foo)/int(bar))
except ZeroDivisionError:
return "0" # or whatever you wanted to return
然后在百分比定义中调用它
percents = [calc_percent(e1.get(),e13.get()),....
您可能还想查看这篇文章,了解您的实际建议:解决此问题的最简单方法是创建一个函数定义,为您进行计算,然后您可以在其中执行错误处理
def calc_percent(foo, bar):
try:
return "%.2f" % (int(foo)/int(bar))
except ZeroDivisionError:
return "0" # or whatever you wanted to return
然后在百分比定义中调用它
percents = [calc_percent(e1.get(),e13.get()),....
您可能还想查看这篇文章,了解您的实际建议:“我希望通过循环创建列表,但尝试e(I)与e1不同,因此我被该问题所阻碍。”您可以创建条目列表。然后你可以做
entries[i]
“我希望通过循环创建列表,但尝试e(i)与e1不同,因此我被该问题所阻碍。”你可以创建一个条目列表。然后你可以做entries[i]
。我只需将e1
等作为参数传递,然后调用get
insidecalc\u percent
。我尝试了这个方法,但出现了一些错误。在原始帖子中对其进行编辑。我只是将e1
等作为参数传递,然后在calc_percent
内部调用get
。我尝试了这种方法,但出现了一些错误。将其放入原始帖子的编辑中。如果。。。else作为列表中的守卫。列表只有一个值,可以是生成器,也可以是值y
。非常好。谢谢,这很有效,比我的方法简单得多。如果。。。else作为列表中的守卫。列表只有一个值,可以是生成器,也可以是值y
。非常好。谢谢,这很有效,比我的方法简单得多。