在Python中生成列表时除以零

在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"

我试图将用户输入生成的百分比列表放入表中。该表正在工作,并具有来自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" % (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
inside
calc\u percent
。我尝试了这个方法,但出现了一些错误。在原始帖子中对其进行编辑。我只是将
e1
等作为参数传递,然后在
calc_percent
内部调用
get
。我尝试了这种方法,但出现了一些错误。将其放入原始帖子的编辑中。如果。。。else作为列表中的守卫。列表只有一个值,可以是生成器,也可以是值
y
。非常好。谢谢,这很有效,比我的方法简单得多。如果。。。else作为列表中的守卫。列表只有一个值,可以是生成器,也可以是值
y
。非常好。谢谢,这很有效,比我的方法简单得多。