On Fri, Oct 7, 2011 at 3:39 PM, lina <lina.lastn...@gmail.com> wrote:
> > > On Fri, Oct 7, 2011 at 9:50 AM, Steven D'Aprano <st...@pearwood.info>wrote: > >> lina wrote: >> >> May I ask a further question: >>> >>> a >>>>>> >>>>> {'B': [4, 5, 6], 'E': {1, 2, 3}} >>> >> >> Why is a['B'] a list and a['E'] a set? >> >> >> >> >> How can I get the value of >>> set(a['E'])+set(a['B']) >>> >>> I mean, get a new dict 'B+E':[5,7,9] >>> >> >> >> You are confusing different things into one question, as if I had asked: >> >> "How do I make a hard boiled egg? I mean, get a potato salad." >> >> You must ask a clear question to get a clear answer. >> >> >> >> To answer your first question, what do you mean by adding two sets? I can >> take the *union* of two sets (anything in either one OR the other): >> >> >>> a['E'] | set(a['B']) # one is already a set, no need to convert >> {1, 2, 3, 4, 5, 6} >> >> >> or I can take the *intersection* of the two sets (anything in both one AND >> the other): >> >> >>> a['E'] & set(a['B']) >> set() >> >> There are no items in common between the two, so nothing in the >> intersection. >> >> >> To get the result you are asking for: >> >> [5, 7, 9] >> >> makes no sense. How do you expect to get a *list* by combining two *sets*? >> They are different things. Lists have order, sets do not: >> >> >>> [1, 2, 3] == [3, 2, 1] >> False >> >>> {1, 2, 3} == {3, 2, 1} >> True >> >> >> A list is a sequence of values in order, a set is like a jumble of values >> tossed in a bag. >> >> My *guess* is that you don't care about sets at all, you want two lists: >> > > Thanks, I did not realize the great differences between the list and sets. > I was not so sensitive about the concepts before. > >> >> >> [1, 2, 3] >> [4, 5, 6] >> >> >> and you want to add them item by item to get another list: >> >> [5, 7, 9] >> >> >> Have I guessed correctly? >> >> >> If so, here's the hard way to do it: >> >> >> first_list = [1, 2, 3] >> second_list = [4, 5, 6] >> result = [] >> for i in range(3): >> a = first_list[i] >> b = second_list[i] >> result.append(a + b) >> >> print(result) >> >> >> Walking along two lists in lock-step like that is so common that Python >> has a dedicated function specially for it: zip. >> >> result = [] >> for a,b in zip(first_list, second_list): >> result.append(a+b) >> >> >> which can be simplified further to a list comprehension: >> >> result = [a+b for a,b in zip(first_list, second_list)] >> >> > Thanks, just why the output it's something double, more than I want. > > #!/bin/python3 > > import os.path > > TOKENS="BE" > > LINESTOSKIP=0 > INFILEEXT=".xpm" > OUTFILEEXT=".txt" > > def dofiles(topdirectory): > for filename in os.listdir(topdirectory): > processfile(filename) > > def processfile(infilename): > results={} > > base, ext =os.path.splitext(infilename) > if ext == INFILEEXT: > text = fetchonefiledata(infilename) > numcolumns=len(text[0]) > for ch in TOKENS: > results[ch] = [0]*numcolumns > for line in text: > line = line.strip() > for col, ch in enumerate(line): > if ch in TOKENS: > results[ch][col]+=1 > for k,v in results.items(): > print(results) > summary=[] > for a,b in zip(results['E'],results['B']): > summary.append(a+b) > writeonefiledata(base+OUTFILEEXT,summary) > > > def fetchonefiledata(inname): > infile = open(inname) > text = infile.readlines() > return text[LINESTOSKIP:] > > def writeonefiledata(outname,summary): > > outfile = open(outname,"w") > for elem in summary: > outfile.write(str(summary)) > > > > if __name__=="__main__": > dofiles(".") > > > $ python3 counter-vertically-v2.py > {'B': [0, 0, 0, 0, 0, 0], 'E': [1, 0, 1, 0, 1, 0]} > {'B': [0, 0, 0, 0, 0, 0], 'E': [1, 0, 1, 0, 1, 0]} > > $ more try.txt > [1, 0, 1, 0, 1, 0][1, 0, 1, 0, 1, 0][1, 0, 1, 0, 1, 0][1, 0, 1, 0, 1, 0][1, > 0, 1 > , 0, 1, 0][1, 0, 1, 0, 1, 0] > > $ more try.xpm > aaEbb > aEEbb > EaEbb > EaEbE > > Thanks, > I thought it might be some loop reason made it double output the results, so I made an adjustation in indent, now it showed: $ python3 counter-vertically-v2.py {'B': [0, 0, 0, 0, 0, 0], 'E': [1, 0, 1, 0, 1, 0]} {'B': [0, 0, 0, 0, 0, 0], 'E': [1, 0, 1, 0, 1, 0]} [1, 0, 1, 0, 1, 0] Traceback (most recent call last): File "counter-vertically-v2.py", line 48, in <module> dofiles(".") File "counter-vertically-v2.py", line 13, in dofiles processfile(filename) File "counter-vertically-v2.py", line 31, in processfile for a,b in zip(results['E'],results['B']): KeyError: 'E' still two results, but the summary is correct, with a KeyError which I don't know how to fix the key error here. #!/bin/python3 import os.path TOKENS="BE" LINESTOSKIP=0 INFILEEXT=".xpm" OUTFILEEXT=".txt" def dofiles(topdirectory): for filename in os.listdir(topdirectory): processfile(filename) def processfile(infilename): results={} base, ext =os.path.splitext(infilename) if ext == INFILEEXT: text = fetchonefiledata(infilename) numcolumns=len(text[0]) for ch in TOKENS: results[ch] = [0]*numcolumns for line in text: line = line.strip() for col, ch in enumerate(line): if ch in TOKENS: results[ch][col]+=1 for k,v in results.items(): print(results) summary=[] for a,b in zip(results['E'],results['B']): summary.append(a+b) print(summary) writeonefiledata(base+OUTFILEEXT,summary) def fetchonefiledata(inname): infile = open(inname) text = infile.readlines() return text[LINESTOSKIP:] def writeonefiledata(outname,summary): outfile = open(outname,"w") for elem in summary: outfile.write(str(summary)) if __name__=="__main__": dofiles(".") Thanks all for your time, > >> >> -- >> Steven >> >> ______________________________**_________________ >> Tutor maillist - Tutor@python.org >> To unsubscribe or change subscription options: >> http://mail.python.org/**mailman/listinfo/tutor<http://mail.python.org/mailman/listinfo/tutor> >> > > > > -- > Best Regards, > > lina > > > -- Best Regards, lina
_______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor