Python-将邮政编码转换为条形码
该代码应采用5位邮政编码输入,并将其转换为条形码作为输出。每个数字的条形码为:Python-将邮政编码转换为条形码,python,python-2.7,Python,Python 2.7,该代码应采用5位邮政编码输入,并将其转换为条形码作为输出。每个数字的条形码为: {1:'...!!',2:'..!.!',3:'..!!.',4:'.!..!',5:'.!.!.',6:'.!!..',7:'!...!',8:'!..!.',9:'!.!..',0:'!!...'} 例如,邮政编码95014应产生: !!.!.. .!.!. !!... ...!! .!..! ...!!! 还有一个额外的在开始和结束处,用于确定条形码开始和停止的位置。请注意,条形码的末尾是一个额外的这是一个
{1:'...!!',2:'..!.!',3:'..!!.',4:'.!..!',5:'.!.!.',6:'.!!..',7:'!...!',8:'!..!.',9:'!.!..',0:'!!...'}
例如,邮政编码95014应产生:
!!.!.. .!.!. !!... ...!! .!..! ...!!!
还有一个额外的代码>在开始和结束处,用于确定条形码开始和停止的位置。请注意,条形码的末尾是一个额外的代码>这是一个1。这是校验位,您可以通过以下方式获得校验位:
- 将zipcode中的所有数字相加,得到Z的和
- 选择校验位C,使Z+C为10的倍数
例如,zipcode95014
的和为Z=9+5+0+1+4=19,因此校验位C为1,使总和Z+C等于20,这是10的倍数
def printDigit(digit):
digit_dict = {1:'...!!',2:'..!.!',3:'..!!.',4:'.!..!',5:'.!.!.',6:'.!!..',7:'!...!',8:'!..!.',9:'!.!..',0:'!!...'}
return digit_dict[digit]
def printBarCode(zip_code):
sum_digits=0
num=zip_code
while num!=0:
sum_digits+=(num%10)
num/=10
rem = 20-(sum_digits%20)
answer=[]
for i in str(zip_code):
answer.append(printDigit(int(i)))
final='!'+' '.join(answer)+'!'
return final
print printBarCode(95014)
我当前拥有的代码生成
代码>
邮政编码95014
,缺少校验位。我的代码中是否缺少导致代码无法输出校验位的内容?另外,我的代码中应该包含哪些内容,以便向用户请求邮政编码输入 您的代码根据数字的总和计算rem
,但您从不使用它将校验数字条添加到输出中(answer
和final
)。为了得到正确的答案,您需要添加代码。我怀疑您也没有正确计算rem
,因为您使用的是%20
而不是%10
我将用以下内容替换函数的最后几行:
rem = (10 - sum_digits) % 10 # correct computation for the check digit
answer=[]
for i in str(zip_code):
answer.append(printDigit(int(i)))
answer.append(printDigit(rem)) # add the check digit to the answer!
final='!'+' '.join(answer)+'!'
return final
有趣的问题。我注意到你作为一个C风格的程序员解决了这个问题。我猜你的背景是C/C++。我想提供一种更具python风格的方式:
def printBarCode(zip_code):
digit_dict = {1:'...!!',2:'..!.!',3:'..!!.',4:'.!..!',5:'.!.!.',
6:'.!!..',7:'!...!',8:'!..!.',9:'!.!..',0:'!!...'}
zip_code_list = [int(num) for num in str(zip_code)]
bar_code = ' '.join([digit_dict[num] for num in zip_code_list])
check_code = digit_dict[10 - sum(zip_code_list) % 10]
return '!{} {}!'.format(bar_code, check_code)
print printBarCode(95014)
我使用列表理解来处理每个数字,而不是迭代。我本可以使用map()函数使其更具可读性,但列表理解更像python。此外,我还使用Python3.x格式进行字符串格式化。以下是输出:
!!.!.. .!.!. !!... ...!! .!..! ...!!!
>>>
你实际上已经有了校验位算法。你在编码时遇到了什么问题?还有,你搜索过“python请求用户输入”吗?我知道我有,但它不起作用…你正在计算rem
,但从未使用过它。我应该把它包括在哪里?它在你的问题陈述中给出。这会产生代码>而不是<代码>代码>。我在尝试时得到了后者,因此您所做的一定与我展示的有所不同。带注释的两行是唯一与问题中的代码不同的行。