现在从事一个长期的项目,我至少相信我必须利用数百个不同的类似功能。我已经至少以尽可能多的方式问了这个问题,至少四次,到目前为止还没有收到任何可行的信息。
这将是我最后一次发布有关此内容的文章,以防万一有人厌倦了看到它,但是我从帖子中大部分注意到的是,人们无法理解为什么我可能需要"数百个"类似功能。因此,我将尽力解释我要完成的目标。
我正在编写一个读取服务CSV文件的程序。目前,我的计划中有" 6个服务"。理想情况下,该程序将为这些服务制作发票,并将其显示为:
Service 1
Service 2
Service 3
Service 4
Service 5
Service 6
但是...在我的程序中,在我提出解决方案之前,我将向您展示下一个,如果服务为空白或空的输出,则会这样:
Service 1
Service 2
Service 4
Service 6
虽然我希望列表看起来像这样
Service 1
Service 2
Service 4
Service 6
现在,要使用Python ReportLabs完成此功能,正常函数看起来像这样:
def print1():
c.setFont('Deja', 12, leading=None)
c.drawString(100, YdrawLocationSVC1, Service1)
c.drawString(100, YdrawLocationSVC2, Service2)
c.drawString(100, YdrawLocationSVC3, Service3)
c.drawString(100, YdrawLocationSVC4, Service4)
c.drawString(100, YdrawLocationSVC5, Service5)
c.drawString(100, YdrawLocationSVC6, Service6)
但是,如果包含该服务的变量为空,则print1()函数将留下空白行,例如第一个示例。感谢您阅读所有这些内容,如果您仍然在这里并愿意提供帮助,我将解决真正的问题。
如果我们测试字符串/服务是空还是完整,并创建一个布尔来表示该字符串/服务,那么在可能被空或完整的可能性中,3个服务具有8个可能的组合,可以放置字符串的位置。
例如,如果字符串1和3是空的,但是字符串2不是,那么我们测试的布尔值将为0& 1& 0。现在您可以看到3个服务,有8个独特的组合
000
001
010
011
100
101
110
111
从这个事实来看,我们可以说6或8或10个服务可能会导致1024个可能的十位布尔值组合(即000000000000000000000000-11111111,0为空,1个已装满)
现在,我已经解释了存在太多可能组合的问题,具体取决于您需要多少服务,我的最后一个问题是。
你们将如何做这样的事情?目前,我的程序处理了6个服务,在CSV文件对所有字符串进行了测试之后,用字典将64个可能的组合写为64个单独的功能。
。我将在此处包含我当前的解决方案,我想补充一点,我现在看到的唯一方法是编写我所做的较长版本。但是我真的不想这样做1或2000次。无论如何,这是我的解决方案>
#BitRep= 000000
def print1():
c.setFont('Deja', 12, leading=None)
c.drawString(100, YdrawLocationSVC1, " ")
c.drawString(100, YdrawLocationSVC2, " ")
c.drawString(100, YdrawLocationSVC3, " ")
c.drawString(100, YdrawLocationSVC4, " ")
c.drawString(100, YdrawLocationSVC5, " ")
c.drawString(100, YdrawLocationSVC6, " ")
#BitRep=000001
def print2():
c.setFont('Deja', 12, leading=None)
c.drawString(100, YdrawLocationSVC1, "Service 6")
c.drawString(250, YdrawLocationSVC1, str(service6))
c.drawString(330, YdrawLocationSVC1, "13 %")
c.drawString(400, YdrawLocationSVC1, str(singleTAXamountSVC6))
c.drawString(470, YdrawLocationSVC1, str(fullTAXamountSVC6))
c.drawString(100, YdrawLocationSVC2, " ")
c.drawString(100, YdrawLocationSVC3, " ")
c.drawString(100, YdrawLocationSVC4, " ")
c.drawString(100, YdrawLocationSVC5, " ")
c.drawString(100, YdrawLocationSVC6, " ")
ETC.
ETC.
#BitRep=111111
def print64():
c.setFont('Deja', 12, leading=None)
c.drawString(100, YdrawLocationSVC1, "Service 1 ")
c.drawString(250, YdrawLocationSVC1, str(service1))
c.drawString(330, YdrawLocationSVC1, "13 %")
c.drawString(400, YdrawLocationSVC1, str(singleTAXamountSVC1))
c.drawString(470, YdrawLocationSVC1, str(fullTAXamountSVC1))
c.drawString(100, YdrawLocationSVC2, "Service 2 ")
c.drawString(250, YdrawLocationSVC2, str(service2))
c.drawString(330, YdrawLocationSVC2, "13 %")
c.drawString(400, YdrawLocationSVC2, str(singleTAXamountSVC2))
c.drawString(470, YdrawLocationSVC2, str(fullTAXamountSVC2))
c.drawString(100, YdrawLocationSVC3, "Service 3 ")
c.drawString(250, YdrawLocationSVC3, str(service3))
c.drawString(330, YdrawLocationSVC3, "13 %")
c.drawString(400, YdrawLocationSVC3, str(singleTAXamountSVC3))
c.drawString(470, YdrawLocationSVC3, str(fullTAXamountSVC3))
c.drawString(100, YdrawLocationSVC4, "Service 4 ")
c.drawString(250, YdrawLocationSVC4, str(service4))
c.drawString(330, YdrawLocationSVC4, "13 %")
c.drawString(400, YdrawLocationSVC4, str(singleTAXamountSVC4))
c.drawString(470, YdrawLocationSVC4, str(fullTAXamountSVC4))
c.drawString(100, YdrawLocationSVC5, "Service 5 ")
c.drawString(250, YdrawLocationSVC5, str(service5))
c.drawString(330, YdrawLocationSVC5, "13 %")
c.drawString(400, YdrawLocationSVC5, str(singleTAXamountSVC5))
c.drawString(470, YdrawLocationSVC5, str(fullTAXamountSVC5))
c.drawString(100, YdrawLocationSVC6, "Service 6 ")
c.drawString(250, YdrawLocationSVC6, str(service6))
c.drawString(330, YdrawLocationSVC6, "13 %")
c.drawString(400, YdrawLocationSVC6, str(singleTAXamountSVC6))
c.drawString(470, YdrawLocationSVC6, str(fullTAXamountSVC6))
,我很想看到您的一些人解决方案,如您所见,我的绝对不是正确的方法。
我也一直在娱乐一个小脚本的想法,该脚本将写下所有这1024个或为我提供许多功能。我也想分享这一点,以防任何人对如何使它起作用有任何想法。
这些只是我编写的脚本中的两个函数print1-print1024
def testMAKECASEDICTIONARYfromFIle():
# This function can be used to create a Case Dictionary in the format
case:功能。函数可以馈送任何衬里的文本文件。
print "cases = {"
# filepath = '/home/smiley/Desktop/sampletenbools'
filepath = '/home/smiley/Desktop/10boolsALL'
with open(filepath) as fp:
num = 1
for cnt, line in enumerate(fp):
var = line
# print var
print("{} : {}".format(str(line).strip("n"), "Print"+ str(num))+",")
num+=1
print "}"
上面的函数创建案例1-1024,基于文本文件,我使用了WordList操纵器来生成。
我将要添加的下一个也是最后一个功能,负责一一编写功能,尽管它尚未完美地工作。再次,我将非常感谢反馈/建议。
def testfile(): #此功能将用于通过用于创建Switch dictionary的同一文件枚举 #但是将为每行定义一个函数。
# filepath = '/home/smiley/Desktop/sampletenbools'
filepath = '/home/smiley/Desktop/10boolsALL'
with open(filepath) as fp:
num = 1
for cnt, line in enumerate(fp):
var = line
b1 = str(var)[0]
b2 = str(var)[1]
b3 = str(var)[2]
b4 = str(var)[3]
b5 = str(var)[4]
b6 = str(var)[5]
b7 = str(var)[6]
b8 = str(var)[7]
b9 = str(var)[8]
b10 = str(var)[9]
# YdrawLocationSVC1=490
# YdrawLocationSVC2=475
# YdrawLocationSVC3=460
# YdrawLocationSVC4=445
# YdrawLocationSVC5=430
# YdrawLocationSVC6=415
# YdrawLocationSVC7=400
# YdrawLocationSVC8=375
# YdrawLocationSVC9=360
# YdrawLocationSVC10=345
if b1 == "0":
YdrawLocationSVC1=1111
YdrawLocationSVC2=490
if b1 == "1":
YdrawLocationSVC1 = 490
if b2 == "0":
YdrawLocationSVC2=1111
YdrawLocationSVC3=475
if b2 == "1":
YdrawLocationSVC2 = 475
if b3 == "0":
YdrawLocationSVC3=1111
YdrawLocationSVC4=1111
if b3 == "1":
YdrawLocationSVC3 = 460
if b4 == "0":
YdrawLocationSVC4=1111
YdrawLocationSVC5=1111
if b4 == "1":
YdrawLocationSVC4 = 445
if b5 == "0":
YdrawLocationSVC5=1111
YdrawLocationSVC6=1111
if b5 == "1":
YdrawLocationSVC5 = 430
if b6 == "0":
YdrawLocationSVC6=1111
YdrawLocationSVC7=1111
if b6 == "1":
YdrawLocationSVC6 = 415
if b7 == "0":
YdrawLocationSVC7=1111
YdrawLocationSVC8=1111
if b7 == "1":
YdrawLocationSVC7 = 400
if b8 == "0":
YdrawLocationSVC8=1111
YdrawLocationSVC9=1111
if b8 == "1":
YdrawLocationSVC8 = 385
if b9 == "0":
YdrawLocationSVC9=1111
YdrawLocationSVC10=1111
if b9 == "1":
YdrawLocationSVC9 = 370
if b10 == "0":
YdrawLocationSVC10=1111
if b10 == "1":
YdrawLocationSVC10 = 355
print "# Bitrep ="+str(var).strip("n")
print "def Print"+str(num)+"():"
print"tc.setFont('Deja', 12, leading=None)"
print "t# SERVICE NAME"+
"ntc.drawString(100, "+str(YdrawLocationSVC1)+", stringn1)"+
"ntc.drawString(100, "+str(YdrawLocationSVC2)+", stringn2)"+
"ntc.drawString(100, "+str(YdrawLocationSVC3)+", stringn3)"+
"ntc.drawString(100, "+str(YdrawLocationSVC4)+", stringn4)"+
"ntc.drawString(100, "+str(YdrawLocationSVC5)+", stringn5)"+
"ntc.drawString(100, "+str(YdrawLocationSVC6)+", stringn6)"+
"ntc.drawString(100, "+str(YdrawLocationSVC7)+", stringn7)"+
"ntc.drawString(100, "+str(YdrawLocationSVC8)+", stringn8)"+
"ntc.drawString(100, "+str(YdrawLocationSVC9)+", stringn9)"+
"ntc.drawString(100, "+str(YdrawLocationSVC10)+", stringn10)"
# print("{} : {}".format(str(line).strip("n"), "Print" + str(num)))
num += 1
# print "n"
再次感谢您真正阅读所有这些的人,甚至对有任何意见或建议与我分享的任何意见或建议的人。
,请按照以下要求更清楚,我的目标是完全从方程式中删除空白线。根据您的想法,我想如何做到这一点。
用户@bendl要求我给出更多的信息,对于那4个示例,00 01 10 11,布尔字符串将像这样制作。
for n in line:
var = n
if str(var)==""
bool1=0
and draw string 2 at location 1
if str(var)=!""
bool1=1
draw string 1 at location 1
但是,这些布尔集合持续的时间越长,您的if语句获得就越先进。我已经尝试为六个服务制作其中之一,并且可以使其通往复杂,词典的管理更加管理。
我认为您需要这样的打印功能:(我将在需要的情况下在代码中发表评论)
def ultimateprint(bitlist, numberOfBools):
if len(bitlist)!=numberOfBools: #check if bitlist is long enough
break
index = 1 #will count the n-th bit that is read
index2 = 1 # will count the n-th service that was requested
for bit in bitlist:
if bit: #bit is 1, service n was requested
printWithLineNeeded("Service " + str(index2), index) # I used this printWithLineNeeded to simplify
#the code you used to get the combined string where you need it.
index2 +=1 #count up the number of services that were requested
else: #bit is not one, empty line will be printed
printEmptyLineInYourWay(index) #index gives which line is empty in your code
index += 1 #end of iteration, one more bit was proceeded
bitlist必须是 [1, 0, 1, 0, 0, 1]
, ints 的列表。第一个1说请求第一台服务,第二个服务不是,第三个是,依此类推。这具有Python将其解释为INT或BOOL的优势,具体取决于您制定代码的方式。
实际上不需要numberOfbools,但是为您提供了与您拥有的服务数量相同的安全性。
for循环是动态的,我想知道在您以前的问题中没有人有这个想法。
我真的希望我能为您提供帮助。如果需要,请随意请求澄清!
我非常同意Monamona的回答,但是如OP所建议的是使用词典。<<<<<<<<<<<<<<
# service1 = 'a'
# service2 = 'b'
# service3 = 'c'
# service4 = 'd'
# service5 = 'e'
# service6 = 'f'
# service7 = 'g'
# service8 = 'h'
serviceList = [service1, service2, service3, service4, service5, service6, service7, service8]
locationList = [l1, l2, l3, l4, l5, l6, l7, l8]
bitlist = [1, 0, 1, 0, 0, 1, 1, 0]
serviceDict = {(not bit, enumeration[0]) : enumeration[1] for bit, enumeration in zip(bitlist, enumerate(serviceList))}
for key, location in zip(sorted(serviceDict.keys()), locationList):
if not key[0]:
print(serviceDict[key])
print(location)
else:
print()
使用此解决方案,只需将print
语句替换为最初是打印解决方案即可。如果您想在没有定义的服务方法的情况下运行,则在顶部注册的行。
这起作用是因为False
可以将0
和True
解释为1
,因此我们首先用not
翻转钻头,然后用所得的布尔值和服务号进行元组,以便在排序时,将首先按与服务关联的位和服务的数量进行排序。
这一切的外观和听起来都很复杂,我绝对认为Monamona的解决方案更可读,但是如果您逐步浏览它并且应该使用词典来解决这个问题,那真的很简单。