创建相同类型的多个功能,任何人都可以做到这一点



现在从事一个长期的项目,我至少相信我必须利用数百个不同的类似功能。我已经至少以尽可能多的方式问了这个问题,至少四次,到目前为止还没有收到任何可行的信息。

这将是我最后一次发布有关此内容的文章,以防万一有人厌倦了看到它,但是我从帖子中大部分注意到的是,人们无法理解为什么我可能需要"数百个"类似功能。因此,我将尽力解释我要完成的目标。

我正在编写一个读取服务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可以将0True解释为1,因此我们首先用not翻转钻头,然后用所得的布尔值和服务号进行元组,以便在排序时,将首先按与服务关联的位和服务的数量进行排序。

这一切的外观和听起来都很复杂,我绝对认为Monamona的解决方案更可读,但是如果您逐步浏览它并且应该使用词典来解决这个问题,那真的很简单。

相关内容

最新更新